Специальная ненавязчивая проверка на стороне клиента ASP.NET MVC3, не препятствующая публикации формы Ajax - PullRequest
4 голосов
/ 18 января 2011

У меня есть страница «Изменить пароль», которая должна хэшировать любые пароли, введенные на странице через Javascript перед отправкой. Чтобы усложнить это, страница загружается с помощью вызова jQuery load () и передается с помощью вызова jQuery.Form ajaxForm (). Все работало в MVC2, но MVC3 доставляет мне неприятности.

То есть у меня есть страница со ссылкой "Изменить пароль", которая при нажатии загружает страницу смены пароля в модальное всплывающее окно jQuery, а затем форма на странице смены пароля передается через библиотеку jQuery.Form (по существу просто оборачивает вызов $ .ajax) и возвращает его результат в модальное то же самое модальное всплывающее окно.

По сути, у меня есть модель с двумя свойствами: OldPassword и NewPassword. У меня есть два скрытых поля, сгенерированные представлением для них. Они содержат хэшированное значение двух других полей, PrehashOldPassword и PrehashNewPassword, и обновляются с помощью событий keyup (я знаю, это означает, что он выполняет полный хэш SHA256 для каждого keyup ... неэффективно, но получил задание для тестирования). Ключевым моментом здесь является то, что проверка регулярных выражений и требуемая проверка полей должны выполняться для этих полей Prehash, которые существуют только на стороне клиента (поскольку, очевидно, я не хочу передавать эти поля на сервер каким-либо образом).

Поэтому я вручную создаю эти два элемента и добавляю атрибуты data-val- * к элементам, т. Е. Они НЕ генерируются помощниками MVC и т. Д. Я предполагаю, что именно здесь я что-то упускаю. Когда форма отправляется с пустыми полями, всплывают все ошибки, которые должны появиться, но форма все равно отправляется и отправляет в любом случае.

==

Итак, что я пробовал:

Да, ненавязчивый библиотечный метод parse () уже вызван для анализа содержимого загруженной формы AJAX, и, похоже, он правильно получает все данные для проверки данных, поскольку я вижу, что ошибки отображаются как поля blur (), и когда я нажимаю на кнопку submit (до того, как запрос ajax завершит работу и заменит содержимое всплывающего окна).

Возможное примечание: этот вызов метода синтаксического анализа ненавязчивой библиотеки происходит ПОСЛЕ ТОГО, как AJAX успешно загружает страницу изменения пароля во всплывающее окно ... привязка отправки формы AJAX помещается в document.ready загруженного содержимого, то есть AJAX привязка отправки формы МОЖЕТ быть привязкой до и, следовательно, запускать вызовы проверки, которые метод синтаксического анализа может связать с событием отправки ...

Однако, (1) я делаю то же самое в других местах без проблем, ЕДИНСТВЕННАЯ РАЗНИЦА в том, что я вручную помещаю эти атрибуты data-val- * в элементы, которые я создаю вручную! И (2), если я вызываю какую-либо ошибку в полях OldPassword или NewPassword, то есть требуемую ошибку проверки поля, не загружая в них значение, они отображают свою ошибку и успешно ОСТАНОВЛЯЮТ форму для отправки через jQuery.Form. способ.

Так что я думаю, что здесь что-то не так:

<input id="PrehashNewPassword" type="password" name="PrehashNewPassword" data-val-required="The password field is required." data-val-regex-pattern="<%= RegexHelper.PasswordRegularExpression %>" data-val-regex="<%= RegexHelper.PasswordRegularExpressionError %>" data-val="true" />

Я знаю, что jquery.validate правильно понимает правила, так как я действительно вижу ошибки. Это просто не мешает отправке формы, когда они являются ошибкой в ​​этих сгенерированных вручную элементах, если я не сделаю что-то подобное, и добавлю обратный вызов перед отправкой в ​​отправку формы AJAX:

        $("#ChangePasswordForm").ajaxForm({
            beforeSubmit: function () { if (!$('#ChangePasswordForm').valid()) { return false; } },
            target: '#overlay'
        });

Хотя это работает, это отчасти уродливо, и я полагаю, что это приводит к тому, что проверка вызывается дважды ... Не большое дело, но не идеальное. Так есть ли какой-нибудь другой вызов, который мне нужно сделать в ненавязчивой библиотеке, чтобы связать их?

Ответы [ 2 ]

6 голосов
/ 08 марта 2011

Не уверен, что обнаружил проблему, но вы можете попробовать вернуть ложь там, если форма недействительна ...

.
.
.
    if (!$('form').valid()) {
           return false;
    }

    // JSON POST...
.
.
.

Если это не сработает, вы можете попробовать:

$.validator.unobtrusive.parse($("#dynamicData"));

после динамического добавления ваших пользовательских входов. «dynamicData» - это идентификатор элемента, обернутого вокруг формы

выше найдено здесь: http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx

0 голосов
/ 26 января 2011

Из интереса, что будет, если вы просто получите форму для проверки?

<script type="text/javascript">
    $("form").submit(function (evt) {

        // validate here should trigger invalid fields
        $('form').valid();

        // JSON POST...         

        // stop form submitting
        evt.preventDefault();
    });
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...