Функция проверки mvc3, запускаемая после завершения проверки - PullRequest
4 голосов
/ 09 ноября 2011

Я использую проверку на стороне клиента MVC3.Есть ли способ запустить функцию один раз, после того, как сработали валидаторы?

В идеале я хочу, чтобы Автомагистраль урегулирования запуска и размещение ошибок соответственно, и как только это будет завершено, я хочу, чтобы другая функция запускалась только один раз.В данный момент я вызываю эту функцию из сайта урегулирования ошибок. Она запускается для каждой ошибки, которая влияет на производительность.

Любая помощь с благодарностью получена.

Обновление

Когда в MVC запускается ненавязчивая проверка на стороне клиента, каждый валидатор будет вызывать либо функцию успеха, либо функцию errorPlace.В основном, если у меня есть пятнадцать валидаторов на странице, одна из этих функций будет запускаться для каждого валидатора (т.е. 7 успехов, 8 ошибок или 5 успехов и 10 ошибок).Что я хочу сделать, так это вызвать функцию, которая будет запущена один раз после того, как валидаторы пройдены, а функции success и errorPlacement сделали там биты ...

В данный момент я вызываю функцию 15 разпотому что я не могу понять, где я могу поместить функцию, где она будет запускаться только один раз.

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

Плагин jQuery Validation перехватывает событие формы submit с помощью обработчика событий, который вызывает его функцию validate() для проверки формы перед отправкой и, таким образом, предотвращает отправку формы в случае сбоя проверки.

Если выподключите событие submit для каждой из ваших форм с помощью jQuery и сделайте это внизу ваших форм, это добавит ваш собственный обработчик для выполнения перед обработчиком плагина.Таким образом, вы можете самостоятельно вызывать функцию valid() в формах и запускать любой пользовательский код, который вы хотите, после полной проверки формы.Функция valid() плагина вызывает функцию validate() в форме, а затем возвращает логическое значение для успеха / неудачи.Если вас не волнует успех / неудача, вы можете просто позвонить validate() напрямую, вместо того, чтобы звонить valid().

Когда вы звоните valid() или validate() в форме, он продолжитработать с ненавязчивой проверкой клиента MVC3, чтобы пометить форму ошибками проверки, за исключением того, что теперь вы сможете делать что-то еще после вызова.

Я установил контрольные точки в своем собственном обработчике submit() (ниже)и в плагине проверки jQuery validate() и valid() функции.Я вижу, что в этой реализации их вызывают только один раз, поэтому проверка полной формы не должна выполняться несколько раз.

Конечно, плагин также перехватывает события focus, blur, keyup и click, поэтомуВалидаторы для отдельных полей уже вызваны несколько раз, поэтому пользователю предоставляется немедленная обратная связь по ошибкам / разрешенным полям формы.Проверка ленива в том смысле, что она не запускается, пока пользователь не введет значение в поле.Когда пользователь вводит значение и покидает поле, поле проверяется.Если поле помечено как недействительное, повторная проверка полна решимости, поскольку недопустимое поле неоднократно проверяется на различные события, пока не будет установлено, что оно является действительным.

Поместите следующее в нижней части вашей страницы,ниже всех form тегов.Как написано, с помощью селектора $("form") он будет обрабатывать событие submit для всех элементов form на странице.Конечно, вы можете использовать селекторы jQuery, чтобы выбрать определенные form теги для проверки.Просто вызовите valid() или validate() в форме всякий раз, когда вы хотите выполнить проверку, и следуйте ей с любым кодом, который вы хотите выполнить один раз.

Чтобы получить результат проверки:

<form>
...
</form>

<script type="text/javascript">
    $("form").submit(function (e) {
        if ($(this).valid() == false) {
            alert("yo!"); // execute anything you want following validation
        }
    });
</script>

Или, если вы не хотите знать результат проверки:

<script type="text/javascript">
    $("form").submit(function (e) {
        $(this).validate();
        alert("yo!"); // execute anything you want following validation
    });
</script>
1 голос
/ 18 ноября 2011

Я бы предложил заменить функцию defaultShowErrors в jquery.validate.js, отразить ее и добавить вызов в функцию размещения. defaultShowErrors вызывается после запуска проверки для отдельного элемента или всей формы.

Добавьте следующее в файл javascript (вставленный после jquery.validate.js) или в скрипт на вашей странице:

$.extend($.validator.prototype, {
    defaultShowErrors: function() {
        for ( var i = 0; this.errorList[i]; i++ ) {
            var error = this.errorList[i];
            this.settings.highlight && this.settings.highlight.call( this, error.element,  this.settings.errorClass, this.settings.validClass );
            this.showLabel( error.element, error.message );
        }
        if( this.errorList.length ) {
            this.toShow = this.toShow.add( this.containers );
        }
        if (this.settings.success) {
            for ( var i = 0; this.successList[i]; i++ ) {
                this.showLabel( this.successList[i] );
            }
        }
        if (this.settings.unhighlight) {
            for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
                this.settings.unhighlight.call( this, elements[i], this.settings.errorClass,  this.settings.validClass );
            }
        }
        this.toHide = this.toHide.not( this.toShow );
        this.hideErrors();
        this.addWrapper( this.toShow ).show();

        // INSERT CALL TO YOUR CUSTOM PLACEMENT FUNCTION HERE
    }
});
1 голос
/ 15 ноября 2011

У них нет опции для этого, но вы могли бы сделать это, переопределив существующую функцию form или что-то подобное.

var originalForm = $.validator.prototype.form;
$.validator.prototype.form = function() {
    var returnValue = originalForm.call(this);
    if(!returnValue) { 
        //do my custom invalid handling here 
    }
    return returnValue;
}

Я не тестировал этот код, я попытаюсь поставить скрипку, но я не уверен на 100%, как выглядит ненавязчивая реализация в MVC3, поскольку я ее не использовалеще.Если бы вы могли создать скрипку с макетом вашего выходного HTML / JS, мы могли бы это понять.

0 голосов
/ 18 ноября 2011

поставьте [SessionState(SessionStateBehavior.Default)] над определением класса, а затем отметьте if (Session.IsNewSession == true), чтобы он запускался только в первый раз.в качестве альтернативы вы можете установить Session["somevariable"] = "somevalue", если хотите отменить свою функцию и установить if (Session["somevariable"] == "somevalue").таким образом вы можете переключаться, если ваша функция должна быть выполнена.

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