如何修复模型以正确使用 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 种状态(true
或 false
)并且任何一种都有效,因此 [RequiredIfFalse]
实际上是说该值必须是 true
或false
,它总是假设您使用 @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;
}
我正在尝试使用 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 种状态(true
或 false
)并且任何一种都有效,因此 [RequiredIfFalse]
实际上是说该值必须是 true
或false
,它总是假设您使用 @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;
}