0

MVC Foolproof ライブラリを使用してモデルを検証し、それぞれエラー メッセージを表示しようとしています。ただし、データ注釈を正しく適用していないため、検証が機能しません。

私の要件は、2 つのチェックボックスがあり、フォームを送信する前に少なくとも 1 つをチェックする必要があることです。以下は、データ注釈付きのモデルの両方のフィールドのコードです。

    [RequiredIfFalse("CheckBox2", ErrorMessage = "Please select atleast one checkbox.")]
    public bool Checkbox1 { get; set; }

    [RequiredIfFalse("Checkbox1", ErrorMessage = "Please select atleast one checkbox.")]
    public bool CheckBox2 { get; set; }

チェックボックスをオンにせずにフォームを送信すると、フォームが送信され、エラーは表示されません。最初のフィールドを int または string として作成し、CheckBox がチェックされている場合に必須にすると、検証が正常に機能し、それに応じて検証メッセージが表示されるため、モデルとカスタム検証属性を適用する方法に論理的な誤りがあることはわかっています。景色。上記のフィールドの論理エラーを特定するのを手伝ってください。

4

3 に答える 3

2
[Required]
public bool DidWin {get;set;}

[RequiredIfFalse(nameof(DidWin))]
public string ExplainationWhyDidntWin {get;set;}  // Doesn't work

[RequiredIfNot(nameof(DidWin), true)]
public string ExplainationWhyDidntWin2 {get;set;} // Works

この問題を解決するにはmvcfoolproof.unobtrusive.js、次のものを見つけて置き換えます。

var isBool = function (input) {
    return input === true || input === false || input === "true" || input === "false";
};

var isBool = function (input) {
    return input === true || input === false || input.toLowerCase() === "true" || input.toLowerCase() === "false";
};

else if (isBool(value1)) {
    if (value1 == "false") value1 = false;
    if (value2 == "false") value2 = false;
    value1 = !!value1;
    value2 = !!value2;
}

else if (isBool(value1) && isBool(value2)) {
    if (value1 == "false") value1 = false;
    if (value2.toLowerCase() == "false") value2 = false;
    value1 = !!value1;
    value2 = !!value2;
}
于 2016-07-04T11:07:00.367 に答える
0

以下のようにフールプルーフのデータ注釈を変更すると、問題が解決することがわかりました。

    [RequiredIfNot("CheckBox2", true, ErrorMessage = "Please select atleast one checkbox.")]
    public bool CheckBox1 { get; set; }

    [RequiredIfNot("CheckBox1", true, ErrorMessage = "Please select atleast one checkbox.")]
    public bool CheckBox2 { get; set; }

これにより、値が提供されているかどうかを確認するために使用されていた RequiredIfFalse を使用して実際に達成されなかった値を確認しており、フィールド値が false であるかどうかを確認していると思いました。私にそれを明確にしてくれた@Stephen Mueckeに感謝します。

唯一の欠点は、両方のチェックボックスがチェックされていない場合、一度だけ表示したい両方のコントロールに対してエラーメッセージが表示されることです。ただし、チェックボックスのいずれかがチェックされている場合、検証は正常に機能し、エラー メッセージは表示されません。

編集: CheckBox のいずれかに ErrorMessage=" " を使用すると、重複したエラー メッセージが削除されます。そのため、CheckBox がチェックされていない場合はエラー メッセージが 1 回表示され、CheckBox のいずれかがチェックされている場合はエラー メッセージは表示されません。

編集:ビューのコードは次のとおりです。

            <div class="col-sm-3">
                @Html.CheckBoxFor(m => m.CheckBox1)
                @Html.LabelFor(m => m.CheckBox1)
            </div>

            <div class="col-sm-3">
                @Html.CheckBoxFor(m => m.CheckBox2)
                @Html.LabelFor(m => m.CheckBox2)
            </div>

モデルのコードも提供されており、ビューのコードを提供しました。コントローラーで他に何も行われておらず、ハックなしで動作します。エラーは、検証の概要に自動的に表示されています。ValidationFor も使用しましたが、それでも問題なく動作します。

于 2015-06-08T23:04:15.537 に答える