MVC 3和JQuery中的手动表单验证

时间:2011-02-19 23:59:52

标签: jquery asp.net-mvc-3 jquery-validate

当用户选择“GO”按钮时,我希望能够在客户端触发表单验证。目前,当选择“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

   <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());
//            })
    });

感谢Using jQuery To Hijack ASP.NET MVC Form Posts指出我正确的方向。但仍然不完美

4 个答案:

答案 0 :(得分:10)

我不知道这是否是最好/最有效的方式,但我是通过在我自己的函数中单独验证每个元素来实现的。

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

让它自动验证会很棒,但我似乎总是遇到一些奇怪的业务逻辑规则,这些规则不会被通用验证方法所捕获。这样做可以让我按照我想要的方式控制所有验证,但大部分时间都依赖于内置验证。

答案 1 :(得分:8)

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

答案 2 :(得分: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();
});

答案 3 :(得分:0)

它在IE中不起作用,因为你缺少一个分号:

var val = $('#myForm').validate()