0

我正在尝试使用 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 被选中时使其成为必需,则验证工作正常并且验证消息会相应地显示在风景。请帮助我识别上述字段中的逻辑错误。

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 回答
1

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

于 2015-06-08T12:23:14.430 回答
0

我发现当我修改 Foolproof 的数据注释时,我的问题得到了解决,如下所示,

    [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,它也可以正常工作。

于 2015-06-08T23:04:15.537 回答