В приложении MVC3 с использованием ненавязчивой проверки jquery и представления/модели с валидатором [Remote]: я пытаюсь отключить кнопку отправки и отобразить значок ожидания во время удаленной проверки и при отправке действительной формы на сервер. Я думал, что у меня все получилось, пока не попробовал в IE8.
Проблема заключалась в том, что GC и FF не запускали событие отправки формы, когда форма была недействительной, поэтому я просто отключил кнопку отправки во время этого события. Однако IE8 запускает это событие, когда форма недействительна, из-за чего пользователь никогда не сможет щелкнуть ее снова. (IE8 не отправляет форму, но событие запускается.)
Я попытался прикрепить функцию к событию нажатия кнопки отправки. Там я отключил кнопку отправки, показал значок ожидания и получил следующее:
$('[data-app-form-submit-button="true"]').live('click', function (e) {
var form = $(this).parents('form');
var icon = form.find('[data-app-form-submitting-icon="true"]');
icon.show();
$(this).attr('disabled', 'disabled');
$.ajaxSetup({ async: false });
var isValid = form.valid();
$.ajaxSetup({ async: true });
alert(isValid);
});
Проблема в том, что вызов установки ajax на самом деле не отключает асинхронность. Это происходит, если я убираю его из функции щелчка, но тогда он отключает асинхронность для всего. Вместо этого страница немедленно сообщает «true», что проверяется путем установки точки останова в методе действия удаленной проверки.
Любые идеи?
Дополнительное примечание:
Я забыл упомянуть, что в IE8 событие отправки запускается только тогда, когда рассматриваемое текстовое поле не проходит проверку, которая может произойти на клиенте. Например, если не выполняется обязательное или регулярное выражение, запускается submit(). Для метода действия удаленной проверки он не запускается. Однако, как только он не проходит проверку клиента, последующие удаленные проверки также запускают событие отправки IE8.
Ответ Russ Cam (комментарий №1)
Вот соответствующий код в модели представления:
public class SignUpForm : IValidatableObject
{
[DataType(DataType.EmailAddress)]
[Display(Name = "Email Address")]
[Required(ErrorMessage = "Email Address is required.")]
[RegularExpression(@"^(email regex here)$",
ErrorMessage = "This is not a valid email address.")]
[Remote("Validate", "ControllerName", "AreaName", HttpMethod = "POST")]
public string EmailAddress { get; set; }
public IEnumerable<ValidationResult> Validate(
ValidationContext validationContext)
{
Я рад, что вы заставили меня взглянуть на отрендеренный <form>
. Тег формы и элементы ввода выглядят следующим образом:
<form action="/post-action-method" method="post" novalidate="novalidate">
...
<input class="text-box single-line" data-app-focus="true" data-val="true"
data-val-regex="This is not a valid email address."
data-val-regex-pattern="^(email regex here)$"
data-val-remote="&#39;Email Address&#39; is invalid."
data-val-remote-additionalfields="*.EmailAddress"
data-val-remote-type="POST"
data-val-remote-url="/validate-action-method"
data-val-required="Email Address is required."
id="EmailAddress" name="EmailAddress" type="text" value="">
...
<input type="submit" value="Submit this form"
data-app-form-submit-button="true" />
Я никогда не видел атрибут novalidate="novalidate" до сих пор. Вот как это выглядит в файле cshtml:
@using (Html.BeginForm())
{
@Html.EditorForModel()
@Html.AntiForgeryToken("assault")
}
Я также использую токен защиты от подделки, если это имеет значение. Спасибо.
<form>
из представления? - person Russ Cam   schedule 20.10.2011