Я понял это.
Это было именно то, что я предложил в своем комментарии к первоначальному вопросу. ASP.NET асинхронный постбэк запускался, отправляя старый текст на сервер. Затем мой onclick стрелял, сохраняя новый текст в текстовой области, и достигал моей точки останова (позволяя мне увидеть, что новый текст был фактически сохранен в текстовой области). После этого сервер обработал (старый) текст, достигнув моей точки останова в VB.
Похоже, что ASP.NET получает высший приоритет в любом клике, который происходит, по крайней мере, при использовании асинхронных средств. Это означает, что любые пользовательские обработчики кликов, добавленные через 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
, который сохраняет содержимое редактора в текстовую область. Это сохранит содержимое каждый раз, когда редактор добавляет то, что они называют «уровнем отмены», что означает, что каждый раз, когда пользователь что-то меняет и перемещает курсор, или всякий раз, когда редактор стирает, среди других событий.