asp.net mvc отключить кнопку отправки, если форма недействительна

Есть ли способ отключить/отправить кнопку отправки формы, если форма имеет ошибки проверки таким образом, что пользователь может щелкнуть ее, только если форма действительна. Я использую ненавязчивую проверку с «удаленной» проверкой атрибутов с помощью ASP.Net MVC 4 и бритвы.

Спасибо и всего наилучшего


person Dario    schedule 18.09.2013    source источник
comment
Я думаю, вы хотите сделать это client side ?   -  person christiandev    schedule 18.09.2013


Ответы (1)


Зависит от того, где вы делаете свою проверку. Если вы делаете это на стороне сервера с помощью jquery, вы можете добавить e.preventDefault к проверке, если он недействителен, и нажатие кнопки не сработает, пока ваши условия не будут выполнены. Если вы выполняете проверку на стороне сервера с использованием атрибутов, вы можете проверить состояние модели, например

if (ModelState.IsValid){
}else{
}

и если состояние модели допустимо (данные проходят все проверки), запустите один набор кода. Если состояние модели недействительно, просто верните представление, чтобы вернуться к тому, с чего вы начали, и передайте сообщение с тем, что не удалось для пользователя. Надеюсь, это поможет.

Обновлять:

только что увидел редактирование вашего комментария. Для вызова ajax вы захотите использовать предотвращение по умолчанию.

$('.SubmitButton').on('click', function(e){
   $.ajax({
      //your call
      success: function(result){
          if(result.false){
              e.preventDefault();
              alert(result.message);
          }
      }
   });
});

поэтому, если вызов будет успешным, вызов отправки пройдет. Если это ложь, то jquery остановит нажатие кнопки, и вы сможете отобразить сообщение или сделать что-то еще.

person Matt Bodily    schedule 18.09.2013
comment
Привет Мэтт и спасибо за ваш ответ. Я выполняю проверку на стороне сервера, но мое действие возвращает просто JsonResult с true/false в зависимости от значения. Что мне нужно, так это обратный вызов js для вызова после завершения проверки ajax, чтобы отключить/включить кнопку отправки с помощью js... верно? - person Dario; 18.09.2013
comment
если ваша проверка работает на стороне сервера, я бы позволил кнопке работать, чтобы вы могли перейти на сервер для проверки значений, но затем направить их в соответствии с результатом. Если это действительно так, перенаправляйте или делайте все, что будет дальше. Если недействительно, просто верните View(model), и мы обычно используем viewbag, чтобы передать ошибку проверки обратно в представление для пользователя. - person Matt Bodily; 18.09.2013
comment
см. мое обновление в ответе для остановки нажатия кнопки при вызове ajax - person Matt Bodily; 18.09.2013
comment
ммм, я стараюсь быть более точным. В моей модели регистрации есть: code [Remote(CheckIfEmailExists, Register)] public string Email { get; задавать; } code и CheckIfEmailExists is code [HttpPost] public JsonResult CheckIfEmailExists(string email) { //todo: заменить на логику, чтобы увидеть, существует ли электронная почта bool result = false; вернуть Json (результат); } code Все работает нормально, однако, если проверка не удалась, у меня нет возможности отключить кнопку отправки с помощью JS. - person Dario; 18.09.2013
comment
Если вы запускаете вызов ajax нажатием кнопки и используете e.preventDefault() при сбое, jquery остановит нажатие кнопки. Если вы вернете true, это позволит продолжить нажатие кнопки. - person Matt Bodily; 18.09.2013
comment
вызов ajax запускается автоматически, когда фокус выходит из текстового поля... как перехватить обратный вызов с помощью js? - person Dario; 18.09.2013
comment
для нескольких полей я бы использовал скрытые поля, в которых хранится результат проверки. при вашем вызове ajax я бы проверил, все ли поля верны. Запустите кнопку отправки, чтобы она была отключена, и когда все верно, включите эту кнопку. вот ссылка, в которой рассказывается о добавлении и удалении атрибутов из элементов с помощью jquery stackoverflow.com/questions/11489037/ - person Matt Bodily; 18.09.2013
comment
Спасибо, Мэтт, но моя проблема заключается именно в управлении результатом проверки ajax... Я не могу найти простой способ запустить обратный вызов, который проверит результат и соответственно отключит кнопку... - person Dario; 18.09.2013