Проверка формы вручную в MVC 3 и JQuery
Я хочу иметь возможность инициировать проверку формы на стороне клиента, когда пользователь выбирает кнопку "GO" . В настоящее время, когда выбрана кнопка "GO" , она не проверяет полную форму. Например, если я загружаю форму и выбираю кнопку "Перейти", не фокусируясь на текстовом поле, ничего не проверяется, и val.Valid() возвращает true. Если я ввожу неверные данные в текстовое поле, проверка выполняется для этого отдельного элемента; и когда я выбираю кнопку "GO" , val.Valid() возвращает false.
Итак, что я пытаюсь сделать, это когда пользователь выбирает кнопку или другое событие, я хочу запустить проверку всех форм.
Я делаю это в MVC 3
public class TestValidationModel
{
[Required(ErrorMessage="UserName Is Required")]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
[StringLength(12, MinimumLength = 3)]
public string UserName { get; set; }
[Required(ErrorMessage="Password Is Required")]
[StringLength(20, MinimumLength = 3)]
public string Password { get; set; }
[Required(ErrorMessage="Email Address Is Required")]
[Display(Name = "Email Address")]
public string EmailAddress{ get; set; }
}
<script src="/BasicMvc3Example2/Scripts/jquery-1.4.4.js" type="text/javascript"></script>
<script src="/BasicMvc3Example2/Scripts/jquery-ui.js" type="text/javascript"></script>
<script src="/BasicMvc3Example2/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="/BasicMvc3Example2/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$("#butValidateForm").click(function(){
var val = $('#myForm').validate()
alert(val.valid());
})
});
</script>
@using (Html.BeginForm("", "", FormMethod.Post, new {id = "myForm"}))
{
<div>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</div>
<div>
@Html.LabelFor(m => m.Password)
@Html.TextBoxFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<div>
@Html.LabelFor(m => m.EmailAddress)
@Html.TextBoxFor(m => m.EmailAddress)
@Html.ValidationMessageFor(m => m.EmailAddress)
</div>
<button id="butValidateForm">GO</button>
<input type="submit" id="submitForm" value="Submit" />
}
Update
Думаю, я нашел решение своей проблемы. См. ShowErrors Ниже
<script type="text/javascript">
$(function () {
$("#butValidateForm").click(function () {
var val = $('#myForm').validate();
val.showErrors(); //<-- Call showErrors
alert(val.valid());
})
});
</script>
Эта следующая ссылка на сообщение в формах JQuery не касалась моей проблемы, но я смог найти имена методов, которые я искал.
http://plugins.jquery.com/content/jqueryvalidate-showerrors-issue-form-wizard
Если у кого-то есть лучший ответ, пожалуйста, предоставьте отзыв.
Update
Предыдущий код несколько работает в Firefox, но совсем не в IE. Я сделал следующее, и теперь он работает в Firefox, но все еще не в ID
$(function () {
$("#myForm").submit(function (e) {
var val = $('#myForm').validate(); //<--added the semi-colon
val.showErrors();
alert(val.valid());
e.preventDefault();
});
});
// $("#butValidateForm").click(function () {
// var val = $('#myForm').validate()
// val.showErrors();
// alert(val.valid());
// })
});
Спасибо за Использование jQuery для захвата сообщений ASP.NET MVC Form для указания меня в правильном направлении. Но все же не идеальный
Ответы
Ответ 1
Я не знаю, является ли это лучшим/наиболее эффективным способом, но я делаю это, проверяя каждый элемент отдельно в своей собственной функции.
jQuery(document).ready(function () {
$("#butValidateForm").button().click(function () { return IsMyFormValid(); });
$('#myForm').validate();
}
function IsMyFormValid() {
var isValid = false;
isValid = $('#myForm').validate().element($('#UserName '));
isValid = ($('#myForm').validate().element($('#Password '))) ? isValid : false;
isValid = ($('#myForm').validate().element($('#EmailAddress'))) ? isValid : false;
return isValid;
}
Было бы здорово, если бы оно автоматически проверялось, но я всегда сталкиваюсь с каким-то странным правилом бизнес-логики, которое не попадает под общие методы проверки. Выполнение этого способа позволяет мне контролировать все проверки так, как я хочу, но большую часть времени полагаюсь на встроенную проверку.
Ответ 2
<script type="text/javascript">
$(function () {
$("#butValidateForm").click(function (event) {
var isValid = $('#myForm').valid();
if(isValid)
{
//do something before submit the form
$('#myForm').submit();
}else{
alert('validation failed');
}
event.preventDefault();
})
});
</script>
Ответ 3
Не уверен, что вы это поняли, но я столкнулся с тем же в IE с помощью $("#myForm").submit
. Используйте live
:
$("#myForm").live('submit', function (e) {
var val = $('#myForm').validate(); //<--added the semi-colon
val.showErrors();
alert(val.valid());
e.preventDefault();
});
Ответ 4
Не работает в IE, потому что вам не хватает двоеточия:
var val = $('#myForm').validate()