ASP.NET MVC 3 ненавязчивая проверка, отправка и TinyMCE - PullRequest
8 голосов
/ 05 февраля 2011

У нас есть собственный плагин управления файлами / изображениями / документами для TinyMCE, который все еще переносится на jQuery.В то же время, некоторые из наших проектов, которые используют эти функции, должны использовать основанную на прототипах версию TinyMCE & jQuery.noConflict ().Это работает нормально, однако при ненавязчивой проверке в ASP.NET MVC 3 проверка при отправке происходит до того, как будет вызван обратный вызов TinyMCE для копирования содержимого TinyMCE в поле формы.Можно ли подключиться к событию предварительной проверки в ненавязчивой проверке?

Ответы [ 2 ]

14 голосов
/ 06 февраля 2011

Если вы используете кнопки отправки для отправки формы, попробуйте следующее:

$("input[type='submit']").click(function () {
    tinyMCE.triggerSave();
});

Если вы не используете кнопки отправки, просто подключитесь к любому событию, которое происходит непосредственно перед отправкой формы, и вызовите tinyMCE.triggerSave.().

3 голосов
/ 15 декабря 2011

Еще один способ добиться этого, который дает вам больше контроля, - инициализация TinyMCE.Это работает хорошо, за исключением одного случая: последний экземпляр TinyMCE, который вы выходите, не вызывает событие onDeactivate в TinyMCE (оно запускается только при переходе к другому экземпляру TinyMCE).Так что вот способ обойти это - пока, кажется, он работает хорошо, но YMMV.

Примечание: я бы использовал это в сочетании с принятым ответом.Этот код запускает проверку, так как содержимое редактируется в TinyMCE.

tinyMCE.init({
    ...
    setup: ValidationTinyMceSetup
});

И наш метод настройки:

function ValidationTinyMceSetup(editor) {
    var $textarea = $('#' + editor.editorId);

    // method to use to save editor contents to backend input field (TinyMCE hides real input and syncs it up
    // with values on form submit) -- we need to sync up the hidden input fields and call the valid()
    // method from jQuery unobtrusive validation if it is present
    function save(editor) {
        if (editor.isDirty) {
            editor.save();
            var $input = $('#' + editor.editorId);
            if (typeof $input.valid === 'function')
                $input.valid();
        }
    }

    // Save tinyMCE contents to input field on key/up down (efficiently so IE-old friendly)
    var typingTimerDown, typingTimerUp;
    var triggerDownSaveInterval = 1000;     // time in ms
    var triggerUpSaveInterval = 500;        // time in ms

    editor.onKeyDown.add(function (editor) {
        clearTimeout(typingTimerDown);
        typingTimerDown = setTimeout(function () { save(editor) }, triggerDownSaveInterval);
    });

    editor.onKeyUp.add(function () {
        clearTimeout(typingTimerUp);
        typingTimerUp = setTimeout(function () { save(editor) }, triggerUpSaveInterval);
    });


    // Save tinyMCE contents to input field on deactivate (when focus leaves editor)
    // this is via TAB
    editor.onKeyDown.add(function (editor, event) {
        if (event.keyCode === 9)
            save(editor);
    });

    // this is when focus goes from one editor to another (however the last one never
    // triggers -- need to enter another TinyMCE for event to trigger!)
    editor.onDeactivate.add(function (editor) {
        save(editor);
    });
}

Наконец, бонусный элемент, который совершенно не связан: вы можете добавитьсчетчик символов, включив эту функцию в ваш источник JavaScript:

function CharacterCountDisplay(current, max) {
    if (current <= max) {
        return current + ' of ' + max + ' characters max';
    }
    else {
        return '<span style="color: red;">' + current + '</span> of ' + max + ' characters';
    }
}

И в вышеупомянутом методе ValidationTinyMceSetup добавьте:

// check for character count data-val
var character_max = $textarea.attr('data-val-lengthignoretags-max');
if (typeof character_max === 'undefined' || character_max === false) {
    character_max = $textarea.attr('data-val-length-max');
}
if (typeof character_max !== 'undefined' && character_max !== false) {
    var character_count = function (editor) {
        var currentLength = $(editor.getDoc().body).text().length;
        editor.dom.setHTML(tinymce.DOM.get(editor.id + '_path_row'), CharacterCountDisplay(currentLength, character_max));
    };

    // on load show character count
    editor.onInit.add(character_count);

    // while typing update character count
    editor.onKeyUp.add(character_count);
}

Чтобы использовать просто добавьте data-val-length-max="250" к текстовой областитег или что вы используете TinyMCE!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...