TinyMCE文本区域更改在ASP.NET CodeBehind中未被识别

7
我在页面上有几个<asp:TextBox TextMode="MultiLine">元素。在加载时,我通过VB代码将它们填充,然后通过jQuery TinyMCE插件将它们转换为TinyMCE编辑器。每个文本框还有一个关联的按钮,目的是将文本提交回代码后端以插入数据库。
我之前发现,当单击提交按钮时,我必须“保存”编辑器的内容到文本框中,但这不是我的问题。即使我这样做了,编辑仍然没有出现在代码后面。
正如我之前提到的,我正在使用jQuery。这是我的点击处理程序。请记住,在ASP.NET中所有按钮都是提交按钮,因此具有submit类:
$('input.submit').live('click', function() {
    tinyMCE.EditorManager.triggerSave();
});

因此,当单击任何提交按钮时,所有tinyMCE编辑器都会触发其保存事件。执行此操作后,我通过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相当新手,但是这种行为对我来说似乎太荒谬了。我一定是忽略了什么关键点。

你如何将数据传输到服务器? - Thariama
该按钮使用OnCommand,并具有适当的CommandNameCommandArgument,然后在代码后台中,我通过Me.myTextArea.Text访问数据。 - Ryan Kinal
我认为我已经找到了问题所在,但我还没有测试我的理论。我认为 OnCommand 回发首先被执行(异步发送旧数据),然后我的 JS 中断点被触发(因此我可以在调试器中看到编辑后的文本),然后我的 VB 中断点被触发(因此我可以在 VB 调试器中看到旧文本)。这似乎是一个可靠的理论,但像我说的那样,尚未经过测试。 - Ryan Kinal
1个回答

7

我明白了。

这正是我在原问题的评论中建议的。ASP.NET异步回传触发,将旧文本发送到服务器。然后我的onclick被触发,将新文本保存到文本区域,并击中我的断点(允许我看到新文本实际上已保存到文本区域)。之后,服务器处理(旧)文本,在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,它将编辑器的内容保存到文本区域。这将在编辑器添加所谓的“撤消级别”时保存内容,这意味着每当用户更改内容并移动光标,或者每当编辑器模糊等其他事件发生时都会保存。


事实证明这不是全部的故事 - 它并不适用于所有情况。我不知道问题出在哪里,但任何帮助将不胜感激。 - Ryan Kinal
结果证明我很蠢 - 我的新错误是由于缺少 If Not Page.IsPostBack ... End If 导致的。 - Ryan Kinal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接