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

これは、非表示フィールドがフィールドが適用されない場合に使用するように設計されていないためです。非表示フィールドは、フィールドが適用される場合に使用するように設計されてますが、ユーザーからの入力は必要ありません。あなたの状況では、次のことができます。

  • 該当しない限り、フィールドのレンダリングをまったく回避するためにビューロジックを使用してください。
  • フラットアウトの代わりにカスタムバリデーターを使用し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 に答える