ASP.NET MVC 3 ненатрапчиво валидиране, изпращане и TinyMCE

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


person Cymen    schedule 05.02.2011    source източник


Отговори (2)


Ако използвате бутони за изпращане, за да публикувате формуляра, опитайте това:

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

Ако не използвате бутони за изпращане, просто се свържете с каквото и да е събитие, което се случва непосредствено преди изпращане на формуляр и извикайте tinyMCE.triggerSave().

person ctsears    schedule 06.02.2011
comment
Това работи! Прекалявах с това и се притеснявах, че някои хора твърдят, че има грешки с triggerSave(). Направих го по следния начин: в tinyMCE.init({ oninit: mySpecialSubmit, ... }); и mySpecialSubmit има извикването triggerSave(). Работи чудесно! Благодаря ти! - person Cymen; 07.02.2011
comment
Не забравяйте да го поставите във вашия $(document).ready(function(){}). - person John Boker; 29.05.2012

Друг начин да направите това, който ви дава повече контрол, е инициализацията на 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" към вашия таг textarea или каквото и да е, на което използвате TinyMCE!

person Cymen    schedule 15.12.2011