我在页面上有几个<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
其他注释:
EnableEventValidation="false"
和ValidateRequest="false"
(这是一个内部应用程序,此推荐来自更有经验的开发人员) 答案 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。这将在编辑器添加他们称之为“撤消级别”的任何时候保存内容,这意味着用户在任何时候改变某些内容并移动光标,或者编辑器在任何时候模糊,以及其他事件。