如何修复模型以正确使用 MVC Foolproof 库?

How to fix the model to correctly use the MVC Foolproof library?

我正在尝试使用 MVC Foolproof 库来验证我的模型并分别显示错误消息。但是我没有正确应用数据注释,所以验证不起作用。

我的要求是我有两个复选框,并且在提交表单之前至少需要选中其中一个。下面是带有数据注释的模型中两个字段的代码,

    [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 时将其设为必需,则验证工作正常并且验证消息相应地显示在风景。请帮助我找出上述字段中的逻辑错误。

一个布尔值只有 2 种状态(truefalse)并且任何一种都有效,因此 [RequiredIfFalse] 实际上是说该值必须是 truefalse,它总是假设您使用 @Html.CheckBoxFor()。您不能为此使用万无一失的验证属性。

我修改了Foolproof的Data Annotations后发现我的问题解决了,

    [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 未实现的值,它用于检查是否提供了值,我认为它正在检查字段值是否为假。感谢@Stephen Muecke 向我澄清了这一点。

唯一的缺点是,当两个复选框都未选中时,会为两个控件显示错误消息,而我只想显示一次。但是当任何一个复选框被选中时,验证工作正常并且不会显示错误消息。

编辑:如果我对任何 CheckBox 使用 ErrorMessage=" ",则会删除重复的错误消息。因此,如果没有选中 CheckBox,则错误消息将显示一次,如果选中任何 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,它也能正常工作。

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