3

我的页面上有一些字段会根据您在页面上所做的下拉选择出现​​和消失。

所以,例如,我有

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

我为此拥有的 JQuery 代码是

$('#auctionType').change(function () {
    var selectedAuctionType = $("#auctionType").val();
    var englishAuctionType = $("#englishAuctionTypeId").val();
    if (selectedAuctionType == englishAuctionType) {
        $("#automaticExtensionTypeList").show();
        $("#automaticExtensionTypeLabel").show();
    } else {
        $("#automaticExtensionTypeList").hide();
        $("#automaticExtensionTypeLabel").hide();
    }
});

现在,显示和隐藏工作正常。问题是当我提交表单并且该字段automaticExtensionTypeList被隐藏时,表单不会提交,因为automaticExtensionTypeList它是必填字段。问题是如何告诉 MVC 只验证可见字段?

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

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

显然,这可以实现隐藏验证。我的问题是,哪行代码相反?

4

3 回答 3

9

尝试这个:

$.validator.setDefaults({
    ignore: ':hidden, [readonly=readonly]'
});

或用于定制

$.validator.setDefaults({
    ignore: "#automaticExtensionTypeList" 
});
于 2013-03-09T17:47:02.223 回答
5

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

  • 使用视图逻辑来避免渲染字段,除非它适用。
  • 使用自定义验证器,而不仅仅是一个 flat-out Required
  • 在隐藏字段中使用有效的“默认”值。

就个人而言,我会选择最后一个,因为它实现起来最快并且没有任何明显的缺陷 - 您可以在控制器中选择此默认值,然后根据需要对其进行操作。

于 2013-03-09T17:22:42.353 回答
4

这是一个常见的问题。

隐藏不会停止验证。

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

例子:

<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>
}
于 2013-03-09T17:03:09.937 回答