MVC 5防止对隐藏字段进行必要的字段验证

时间:2016-04-12 16:12:30

标签: javascript jquery asp.net-mvc validation

我有一个MVC5 ViewModel,它有以下两个属性:

    public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }       

    [Display(Name = "DOB")]        
    public DateTime DateOfBirth { get; set; }

    [Required]
    [Display(Name = "Business Name")]
    public string BusinessName { get; set; }
}

和以下观点:



@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @id="frmRegister", @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Create a new account.</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    
    <div id="Registration"> 
        <div class="form-group">
            @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
            </div>
        </div>

    </div>
    <!--Extended registration fields here.  Will be hidden during inital registration.  During confirmation these should be visible-->
    <div id="Registration_Ext">

        <div class="form-group">
            @Html.LabelFor(m=> m.DateOfBirth, new { @class = "col-md-2 control-label" })
            <div  class="col-md-10">
                @Html.TextBoxFor(m=> m.DateOfBirth, new { @class = "form-control" })
            </div>
        </div>

        <!--Business Ext Registration fields-->
        <div id="Business_Ext">
            <div class="form-group">
                @Html.LabelFor(m => m.BusinessName, new { @class = "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.TextBoxFor(m => m.BusinessName, new { @class = "form-control" })
                </div>
            </div>
        </div>
    </div>
    
    <div class="form-group">
        <div class="col-md-2 control-label"> </div>
        <div class="col-md-10">
            <input id="submit" type="submit" class="btn btn-default" value="Register" />
            
        </div>
    </div>
}
&#13;
&#13;
&#13;

在启动时,我使用JQuery来隐藏&#34; Registration_Ext&#34; Div,以便不显示DOB和BusinessName字段:

 $(document).ready(function () {
        var ctl = $("#Registration_Ext");
        ctl.hide();

        $("#frmRegister").validate().settings.ignore = ":hidden *";
    });

我尝试了几种不同的方法来阻止在非显示字段上进行验证。我尝试了什么:

1)禁用隐藏输入的验证

$('#Registration_Ext :input').validate().settings.ignore = '*';

2)删除元素的验证类

 $(this).removeClass('input - validation - error');

3)通过&#34;隐藏&#34;手动循环输入并关闭其验证属性:

$("#Registration_Ext :input").each(function () {

            $(this).attr('data-val', false);
            $(this).attr('data-val-required', null);             
        });

我在阅读时也添加了这个,验证值可以在启动时缓存:

$('#frmRegister').removeData('unobtrusiveValidation');
        $('#frmRegister').removeData('validator');
        $.validator.unobtrusive.parse('#frmRegister');

隐藏字段仍在验证。在服务器(Controller)上,ModelState.IsValid每次都返回false。我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

ModelState对象并不关心您在客户端执行的操作。它只是将绑定对象中的值与该对象上的验证属性进行比较。如果这些字段作为空字符串回发,或者根本没有回发,并且它们具有[Required]属性,那么它们将无法生效。

如果不需要这些字段,只需从中删除[Required]属性即可。如果他们通常需要,但不是在这种情况下,请创建一个既不包含它们的视图模型,也不会将[Required]属性应用于它们,并使用该视图这种观点的模型。

答案 1 :(得分:0)

请检查一下。    

    <div class="form-group">
        @Html.LabelFor(m=> m.DateOfBirth, new { @class = "col-md-2 control-label" })
        <div  class="col-md-10">
            @Html.TextBoxFor(m=> m.DateOfBirth, new { @class = "form-control ignore" })
        </div>
    </div>

    <!--Business Ext Registration fields-->
    <div id="Business_Ext">
        <div class="form-group">
            @Html.LabelFor(m => m.BusinessName, new { @class = "col-md-2 control-label" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.BusinessName, new { @class = "form-control ignore" })
            </div>
        </div>
    </div>
</div>

使用表单ID禁用对所选控件的验证。 '.ignore'是一个放在您不想验证的控件上的类。另外,不要使用服务器端验证,在表单提交时使用'$('#frmRegister')。valid()'来检查其他字段的验证。

$("#frmRegister").data("validator").settings.ignore = ".ignore, :hidden";