функция проверки mvc3 для запуска после завершения проверки

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

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

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

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

Обновить

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

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

Комментарии:

1. По крайней мере, для меня не очень понятно, что вы хотите сделать. Не могли бы вы добавить пример кода или немного уточнить?

2. Добавлено обновление — надеюсь, это более четкое объяснение!

Ответ №1:

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

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

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

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

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

Разместите следующее внизу вашей страницы, под всеми form тегами. Как написано, с помощью $("form") селектора он будет обрабатывать событие отправки для всех 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>
  

Ответ №2:

У них нет опции для этого, но вы могли бы сделать это, переопределив существующую функцию 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, мы, вероятно, смогли бы с этим разобраться.

Комментарии:

1. Это круто. Она работает в моем ограниченном тестировании со стандартной Html.BeginForm() формой и Ajax.BeginForm(...) AJAX-формой с ненавязчивым JS. Это не мешает submit обработчикам, поэтому нет необходимости беспокоиться о том, чтобы возиться с bind() / unbind() , live() / die() , delegate() / undelegate() или on() / off() обработчиками событий.

Ответ №3:

Я бы предложил заменить 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 amp;amp; 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
    }
});
  

Ответ №4:

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

Комментарии:

1. Sniffer ищет клиентскую функцию, которая запускается после проверки на стороне клиента или при событии на стороне клиента в браузере. Серверный код C # не применяется.