ASP.NET CodeBehind无法识别TinyMCE Textarea更改

时间:2010-11-23 16:27:57

标签: javascript asp.net vb.net textbox tinymce

我在页面上有几个<asp:TextBox TextMode="MultiLine">个元素。在加载时,我填充它们(通过后面的VB代码),然后将它们转换为TinyMCE编辑器(通过jQuery TinyMCE插件)。每个文本框还有一个与之关联的按钮,目的是将文本提交回后面的代码,以便插入到数据库中。

我之前发现,当点击提交按钮时,我必须将编辑器的内容“保存”到文本框中,但这不是我的问题。即使在我这样做之后,编辑也没有出现在后面的代码中。

正如我所提到的,我正在使用jQuery。这是我的点击处理程序。请记住,所有按钮都是ASP.NET中的提交按钮,因此submit类:

$('input.submit').live('click', function() {
    tinyMCE.EditorManager.triggerSave();
});

因此,当点击任何提交按钮所有时,tinyMCE编辑器会触发其保存事件。执行完之后,我已经检查了我正在寻找的textarea的值(再次,通过JavaScript),它似乎有编辑(我使用Chrome的开发人员工具和console.log):

console.log($(this).parent().find('textarea').val());

但是,在服务器端,我看不到提交按钮的点击处理程序中的编辑内容:

Dim paragraph As String = Me.myTextArea.Text
' Results in the original text, not the edited text

其他注释:

  • 每个编辑器都在自己的更新面板中
  • 由于提交内容的性质(HTML),我必须设置EnableEventValidation="false"ValidateRequest="false"(这是一个内部应用程序,此推荐来自更有经验的开发人员)
  • 我对.NET很新,但这种行为对我来说似乎很荒谬。我必须遗漏一些关键的东西。

1 个答案:

答案 0 :(得分:6)

我已经明白了。

这正是我在对原始问题的评论中提出的建议。 ASP.NET异步回发正在触发,将旧文本发送到服务器。然后我的onclick正在触发,将新文本保存到textarea,然后点击我的断点(让我看到新文本实际上已保存到文本区域)。之后,服务器处理(旧)文本,在VB中命中我的断点。

似乎ASP.NET在任何发生的onclick中都是最优先考虑的,至少在使用异步方式时。这意味着通过javascript添加的任何自定义点击处理程序都会在 ASP.NET点击后触发

考虑到JS如何处理多个点击处理程序,这有点意义 - 这是先到先服务的过程。

在我的情况下,解决方案是在更改时保存TinyMCE编辑器的内容,而不是按下按钮:

$(this).tinymce({
    script_url : '../scripts/tiny_mce.js',
    theme: 'advanced',
    plugins: 'save',
    theme_advanced_buttons1 : 'bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,image,link,unlink,|,fontsizeselect,forecolorpicker',
    theme_advanced_buttons2 : '',
    theme_advanced_buttons3 : '',
    content_css : '../css/landingpage-tinymce.css',
    onchange_callback: function(ed) {
        ed.save();
    }
});

注意onchange_callback将编辑器的内容保存到textarea。这将在编辑器添加他们称之为“撤消级别”的任何时候保存内容,这意味着用户在任何时候改变某些内容并移动光标,或者编辑器在任何时候模糊,以及其他事件。