Как выполнить проверку на стороне сервера перед отправкой

#javascript #jquery #jquery-ui #asp.net-mvc-2

#javascript #jquery #jquery-пользовательский интерфейс #asp.net-mvc-2

Вопрос:

Форма содержит элемент ввода. Введенное значение проверяется с помощью обратного вызова сервера из события размытия andler.

Если введено неправильное значение и нажата кнопка отправки, форма отправляется с неправильным значением: метод проверки не завершен, но выполняется метод действия отправки формы.

Как принудительно выполнить метод Validate() перед выполнением метода отправки формы?

jquery, jQueryUI, ASP .Используются NET MVC2.

 <form id="Form" class='form-fields' method='post'   action='/Report/Render'>
  <input id='test' name='test' value='test' />
  <input id='_submit' type='submit' value='Show report' />
</form>

    $('#test').bind({
        blur: function (e) {
            if (!Validate(e.target)) {
                cancel(e);
            }
        }
    });
  

Обновить

Как требуется в комментарии BobTodd, здесь приведен метод проверки:

 function Validate(elem) {
var i,
  res;
$.ajax('Grid/Validate' );
   {
       data: $("#Form").serializeArray(),
       //async: false,
       type: 'POST',
       error: function (jqXHR, textStatus, errorThrown) {
           elem.skipBlur = true;
           errorMessage(decodeErrorMessage(jqXHR.responseText === undefined ? '' : jqXHR.responseText,
                      textStatus, errorThrown));
           elem.focus();
           elem.select();
           elem.skipBlur = false;
           elem.ischanged = true;
           res = false;
       },
       success: function (data) {
           elem.ischanged = false;
           for (i = 0; i < data.length; i  = 1) {
               $('#'   data[i].name).val(data[i].value);
           }
           res = true;
       }
   });
return false; //  res;
  

}

Update2

Во всех ответах предлагается запретить запуск метода отправки, если проверка не выполнена. Это обеспечивает очень плохой пользовательский интерфейс: проверка занимает некоторое время. Пользователь должен нажать два раза на кнопку отправки, чтобы отправить форму. Как разрешить отправку формы одним щелчком мыши? Метод синхронизации Maksing Validate () использует это, но я не уверен, использует ли sync call разумное решение для этого.

Комментарии:

1. где здесь обратный вызов сервера? Где у вас есть функция Validate (object)?

2. @BobTodd: я обновил вопрос и добавил метод проверки, вызываемый в примере кода

Ответ №1:

Вам нужно будет повторно запустить метод проверки в форме отправки и отменить его там.

Посмотрите на плагин проверки jQuery, он поддерживает методы проверки удаления, которые очень просто работают с mvc.

http://bassistance.de/jquery-plugins/jquery-plugin-validation/

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

Комментарии:

1. Спасибо. плагин jquery validate remote() позволяет вызывать метод на стороне сервера перед отправкой. Форма может содержать элементы ввода, которые проверяются с сервера из события размытия. Как проверить только элемент, который теряет фокус при нажатии кнопки отправки. Проверка обновляет некоторые поля, поэтому вызов сервера для каждого поля невозможен, необходимо проверить только измененное поле. Как это реализовать? Я обновляю вопрос.

2. На самом деле вам это и не нужно. Плагин достаточно умен, чтобы проверять только те поля, которые изменились с момента последней проверки.

3. Два варианта использования: 1) Как показано в примере кода, мне нужно обновить другие поля, если проверка в порядке. Например, после проверки кода продукта название продукта, цена и количество на складе также должны быть обновлены. метод remote() требует, чтобы удаленный валидатор возвращал только true при успешном завершении. Как получить список пар имя / значение, возвращаемых удаленным валидатором? 2) Как передать все поля формы удаленному валидатору? согласно удаленному документу передается только текущее значение поля.

Ответ №2:

Просто отключите кнопку отправки до завершения проверки.

Комментарии:

1. В этом случае пользователь видит активную кнопку отправки и нажимает на нее. После этого событие размытия элемента ввода отключает кнопку отправки. Не уверен, что это предотвращает событие отправки, поскольку кнопка уже нажата. В любом случае это выглядит как плохой пользовательский интерфейс: щелчок в submit игнорируется, пользователь должен нажать еще раз. Должно быть лучше, чтобы отправка выполнялась после успешного завершения проверки. Как это реализовать?

Ответ №3:

Не лучше ли вам было бы привязать этот jquery к событию отправки формы, иначе это произойдет только тогда, когда пользователь покинет текстовое поле…

 $('.form-fields').bind({
        submit: function (e) {
            if (!Validate(e.target)) {
                cancel(e);
            }
        }
    });
  

Комментарии:

1. Validate — это асинхронный метод, он возвращается немедленно, не ожидая результата от сервера. Таким образом, ваш пример кода всегда завершается успешно или всегда блокирует отправку в зависимости от результата, возвращаемого Validate() . Ваш пример работает, если Validate изменен для выполнения вызова синхронизации, как показано в комментариях в valudate code в обновленном ответе. Я не уверен, что изменение Validate для выполнения вызова синхронизации является разумным, документы jquery предупреждают о недопустимости выполнения вызовов syn.

Ответ №4:

Когда вы проверяете поле, добавьте valid класс к элементу, если он допустим. Затем, при отправке формы, просто проверьте, все ли поля имеют этот класс :

 $('#Form').submit(funciton(e){
    $(this).find('input').length == $(this).find('input.valid').length || e.preventDefault();
});
$('#Form input').bind({
    blur: function (e) {
        if(Validate(e.target))
           $(e.target).addClass('valid');
        else  
           $(e.target).removeClass('valid');
    }
});
  

Комментарии:

1. Ваш код требует, чтобы пользователь дважды нажал кнопку отправки, чтобы отправить форму. При первом нажатии выполняется проверка, и отправка всегда отменяется. Я обновил вопрос. Как отправить форму одним щелчком мыши?