javascript - MVC 5 防止隐藏字段的必填字段验证

标签 javascript jquery asp.net-mvc validation

我有一个具有以下 2 个属性的 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; }
}

以及以下 View :

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

启动时,我使用 JQuery 隐藏“Registration_Ext”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)手动循环“隐藏”输入并关闭其验证属性:

$("#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。我在这里做错了什么吗?

最佳答案

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

如果不需要这些字段,只需从中删除 [Required] 属性即可。如果它们通常是必需的,但在本例中不是必需的,请创建一个不包含它们或不对它们应用 [Required] 属性的 View 模型,然后使用该 View 模型对于此 View 。

关于javascript - MVC 5 防止隐藏字段的必填字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36578745/

相关文章:

javascript - 具有网格布局的 Jquery 仪表板

javascript - jQuery - 无法使用计算出的键提取 .data() 属性

javascript - javascript包含后出现不需要的下划线和unix时间戳

asp.net-mvc - 直接nuget在哪里放置文件

javascript - 访问handlebars.js/express-handlebars部分中的javascript变量

javascript - 使用 mouseenter 水平翻译,mouseleave 功能不起作用

javascript - AngularJS:从 Javascript 生成 html 时出现函数未定义错误

c# - 无法作为 webService 访问简单 Controller

c# - (无法)开始使用 Facebook C# SDK

javascript - 在 Javascript 中获取两个字符串之间的字符串的正则表达式