Javascript 正在验证MVC隐藏字段

Javascript 正在验证MVC隐藏字段,javascript,c#,jquery,asp.net,asp.net-mvc,Javascript,C#,Jquery,Asp.net,Asp.net Mvc,我的页面上有几个字段根据您在页面上所做的下拉选择显示和取消显示 比如说,我有 <section> @Html.LabelFor(model => model.AuctionTypeId) <div> @Html.DropDownList("AuctionTypeId", Model.AuctionTypes, @AuctionControllerResource.SelectAuctionType, new { id=

我的页面上有几个字段根据您在页面上所做的下拉选择显示和取消显示

比如说,我有

<section>
            @Html.LabelFor(model => model.AuctionTypeId)
            <div> @Html.DropDownList("AuctionTypeId", Model.AuctionTypes, @AuctionControllerResource.SelectAuctionType, new { id="auctionType", required = "required" })
                @Html.ValidationMessageFor(model => model.AuctionTypeId)       </div>
        </section>
        <section>
            @Html.LabelFor(model => model.AutomaticExtensionType, new { hidden = "true", id = "automaticExtensionTypeLabel" })
            <div> @Html.DropDownList("AutomaticExtensionType", Model.AutomaticExtensions, @AuctionControllerResource.SelectAutomaticExtensionType, new { hidden="hidden", required = "required", id = "automaticExtensionTypeList" }) 
                @Html.ValidationMessageFor(model => model.AutomaticExtensionType)       </div>
        </section>
现在,显示和隐藏像他们应该的那样工作。问题是,当我提交表单时,
automaticExtensionTypeList
字段被隐藏,表单不会提交,因为
automaticExtensionTypeList
是必填字段。问题是我如何告诉MVC只验证可见字段

我已经浏览了我们在这个项目中编写的一些JQuery,我们有这一行

$.validator.setDefaults({ ignore: [] });

显然,这支持隐藏验证。我的问题是,哪一行代码与此相反?

这是一个常见问题

隐藏不会停止验证

我总是通过创建具有重叠属性的多个表单来处理这个问题

示例:

<div id="HasControlls">
@Using(Html.BeginForm)
{
            @Html.LabelFor(model => model.AuctionTypeId)
            @Html.DropDownList("AuctionTypeId", Model.AuctionTypes, @AuctionControllerResource.SelectAuctionType, new { id="auctionType", required = "required" })
                @Html.ValidationMessageFor(model => model.AuctionTypeId)       </div>
        </section>
        <section>
            @Html.LabelFor(model => model.AutomaticExtensionType, new { hidden = "true", id = "automaticExtensionTypeLabel" })
            <div> @Html.DropDownList("AutomaticExtensionType", Model.AutomaticExtensions, @AuctionControllerResource.SelectAutomaticExtensionType, new { hidden="hidden", required = "required", id = "automaticExtensionTypeList" }) 
                @Html.ValidationMessageFor(model => model.AutomaticExtensionType)       </div>
}



<div id="HasNotControlls">
@Using(Html.BeginForm)
{
            @Html.LabelFor(model => model.AuctionTypeId)
            @Html.DropDownList("AuctionTypeId", Model.AuctionTypes, @AuctionControllerResource.SelectAuctionType, new { id="auctionType", required = "required" })
                @Html.ValidationMessageFor(model => model.AuctionTypeId)       </div>
        </section>
        <section>
                @Html.ValidationMessageFor(model => model.AutomaticExtensionType)       </div>
        </section>
}

@使用(Html.BeginForm)
{
@LabelFor(model=>model.AuctionTypeId)
@Html.DropDownList(“AuctionTypeId”,Model.AuctionTypes,@AuctionControllerResource.SelectAuctionType,new{id=“auctionType”,required=“required”})
@Html.ValidationMessageFor(model=>model.AuctionTypeId)
@Html.LabelFor(model=>model.AutomaticExtensionType,new{hidden=“true”,id=“automaticExtensionTypeLabel”})
@Html.DropDownList(“AutomaticExtensionType”,Model.AutomaticExtensions,@AuctionControllerResource.SelectAutomaticExtensionType,new{hidden=“hidden”,required=“required”,id=“automaticExtensionTypeList”})
@Html.ValidationMessageFor(model=>model.AutomaticExtensionType)
}
@使用(Html.BeginForm)
{
@LabelFor(model=>model.AuctionTypeId)
@Html.DropDownList(“AuctionTypeId”,Model.AuctionTypes,@AuctionControllerResource.SelectAuctionType,new{id=“auctionType”,required=“required”})
@Html.ValidationMessageFor(model=>model.AuctionTypeId)
@Html.ValidationMessageFor(model=>model.AutomaticExtensionType)
}

原因是隐藏字段不是为字段不适用时使用而设计的-它们是为字段不适用但不需要用户输入时使用而设计的。在您的情况下,您可以:

  • 使用视图逻辑避免渲染字段,除非 适用
  • 使用而不是只使用所需的
    平头
  • 在隐藏字段中使用有效的“默认”值
就我个人而言,我会选择最后一个,因为它是最快实现的,并且没有任何明显的陷阱-您可以在控制器中选择此默认值,然后根据需要对其进行操作。

尝试以下方法:

$.validator.setDefaults({
    ignore: ':hidden, [readonly=readonly]'
});
或用于定制

$.validator.setDefaults({
    ignore: "#automaticExtensionTypeList" 
});

我不知道你的意思,你能详细说明一下吗?我会用两个完全不同形式的div。这样,当我显示/隐藏时,我也不会以讨厌的隐藏[必需]结束,这会阻止我的表单在你的年龄之外顺从。是的,你所有的方法都会奏效。他们都可以使用更多的细节…我可以把它添加到视图中吗?这就是问题所在-我不想替换它,因为它实际上在外部库(KendoUI)中,可能会在其他地方使用。我要做的是覆盖我的特定页面。我正在执行$(“#automaticExtensionTypeList”).show();,我不能在那个地方添加或删除所需的属性吗?虽然我不太了解语法-更多的是C语言,而不是JQuery语言。语法不应该改变(我也更喜欢C语言,但最近在JQ中做了很多工作。getn对它有点熟悉;)
$.validator.setDefaults({
    ignore: "#automaticExtensionTypeList" 
});