Ручная проверка формы в MVC 3 и JQuery - PullRequest
14 голосов
/ 20 февраля 2011

Я хочу иметь возможность инициировать проверку формы на стороне клиента, когда пользователь выбирает кнопку «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" />
}

Обновление

Я думаю, что нашел решение своей проблемы.См. ShowErrors Below

   <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

Если у кого-то есть лучший ответ, пожалуйста, оставьте отзыв.


Обновление

Предыдущий код несколько работает в 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 Posts для указанияменя в правильном направлении.Но все еще не идеально

Ответы [ 4 ]

10 голосов
/ 20 февраля 2011

Я не знаю, является ли это лучшим / наиболее эффективным способом, но я делаю это, проверяя каждый элемент отдельно в своей собственной функции.

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;
}

Было бы здорово, если бы он автоматически проверялся, но мне всегда кажется, что я сталкиваюсь с каким-то странным правилом бизнес-логики, которое не учитывается общими методами проверки.Делая это таким образом, я могу контролировать все проверки, как я хочу, но большую часть времени полагаюсь на встроенную проверку.

8 голосов
/ 25 июня 2012
<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 голосов
/ 08 марта 2011

Не уверен, что вы уже поняли, но я столкнулся с тем же в IE с $("#myForm").submit.Используйте live:

$("#myForm").live('submit', function (e) {
    var val = $('#myForm').validate(); //<--added the semi-colon
    val.showErrors();
    alert(val.valid());


    e.preventDefault();
});
0 голосов
/ 20 февраля 2011

Это не работает в IE, потому что вы пропустили точку с запятой:

var val = $('#myForm').validate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...