簡體   English   中英

正在驗證MVC隱藏字段

[英]MVC hidden field being validated

我的頁面上有一些字段會出現並消失,具體取決於您在頁面上的下拉選項。

所以,例如,我有

<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: [] });

顯然這可以實現隱藏驗證。 我的問題是,相反的代碼行是什么?

嘗試這個:

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

或者用於定制

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

這樣做的原因是,隱藏字段不是設計時使用一個字段不適-他們設計用於當一個字段適用,但不要求用戶輸入。 在您的情況下,您可以:

  • 除非適用,否則請使用視圖邏輯來避免渲染字段。
  • 使用自定義驗證器而不是僅限於Required
  • 在隱藏字段中使用有效的“默認”值。

就個人而言,我會選擇最后一個,因為它實現起來最快,並且沒有任何明顯的缺陷 - 您可以在控制器中獲取此默認值,然后根據需要進行操作。

這是一個常見問題。

希登斯不會停止驗證。

我總是通過創建具有重疊屬性的多個表單來處理此問題。

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM