В приложении MVC3 с использованием ненавязчивой проверки jquery и представления / модели с [удаленным] валидатором: я пытаюсь отключить кнопку отправки и отобразить значок ожидания во время удаленной проверки, а также при отправке действительной формы всервер.Я думал, что это было прибито, пока я не попробовал это в 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 вызывается только тогда, когда рассматриваемое текстовое поле не проходит проверку, которая может произойти на клиенте.Например, если не удается выполнить обязательное или регулярное выражение, submit () запускается.Для метода действия удаленной проверки он не запускается.Однако, как только он не проходит проверку клиента, последующие удаленные проверки также инициируют событие отправки IE8.
Ответ Рассу Кэму (комментарий № 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")
}
Я также использую токен против подделки, если это имеет значение.Спасибо.