#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 # не применяется.