Как заставить ненавязчивый удаленный валидатор jquery выполнять асинхронную работу?

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

Есть идеи?

Дополнительное примечание:

Я забыл упомянуть, что в IE8 событие отправки запускается только тогда, когда рассматриваемое текстовое поле не проходит проверку, которая может произойти на клиенте. Например, если не удается выполнить обязательное или регулярное выражение, запускается 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 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="&amp;#39;Email Address&amp;#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")
}

Я также использую токен защиты от подделки, если это имеет значение. Спасибо.

7
задан danludwig 21 October 2011 в 20:40
поделиться