Изменение текстовой области TinyMCE не распознается ASP.NET CodeBehind - PullRequest
6 голосов
/ 23 ноября 2010

У меня есть несколько <asp:TextBox TextMode="MultiLine"> элементов на странице. При загрузке я заполняю их (через код VB) и затем превращаю их в редакторы TinyMCE (через плагин jQuery 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, но это поведение мне просто кажется смешным. Я, должно быть, упускаю что-то критическое.

1 Ответ

6 голосов
/ 24 ноября 2010

Я понял это.

Это было именно то, что я предложил в своем комментарии к первоначальному вопросу. 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, который сохраняет содержимое редактора в текстовую область. Это сохранит содержимое каждый раз, когда редактор добавляет то, что они называют «уровнем отмены», что означает, что каждый раз, когда пользователь что-то меняет и перемещает курсор, или всякий раз, когда редактор стирает, среди других событий.

...