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

Rya*_*nal 6 javascript vb.net asp.net textbox tinymce

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

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

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

$('input.submit').live('click', function() {
    tinyMCE.EditorManager.triggerSave();
});
Run Code Online (Sandbox Code Playgroud)

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

console.log($(this).parent().find('textarea').val());
Run Code Online (Sandbox Code Playgroud)

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

Dim paragraph As String = Me.myTextArea.Text
' Results in the original text, not the edited text
Run Code Online (Sandbox Code Playgroud)

其他说明:

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

Rya*_*nal 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();
    }
});
Run Code Online (Sandbox Code Playgroud)

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