我正在尝试使用MVC Foolproof库来验证我的模型并分别显示错误消息。但是,我没有正确应用数据注释,因此验证不起作用。
我的要求是我有两个复选框,在提交表单之前至少需要检查其中一个复选框。下面是带有数据注释的模型中两个字段的代码,
<?php
//error_reporting(0);
function fatalErrorHandler() {
echo 'YAY IT WORKED';
}
# Registering shutdown function
register_shutdown_function('fatalErrorHandler');
// let force a Fatal error -- function does not exist
functiontest();
echo "hello";
?>
现在,当我提交表单而不选中任何复选框时,表单将被提交并且不会显示错误。我知道模型和我应用自定义验证属性的方式存在一些逻辑错误,因为如果我将第一个字段设置为int或字符串并且如果选中CheckBox则需要它,那么验证工作正常并且相应地显示验证消息风景。请帮助我识别上述字段中的逻辑错误。
答案 0 :(得分:1)
布尔值只有2个状态(true
或false
),其中任何一个都有效,因此[RequiredIfFalse]
实际上是说该值必须是true
或{{ 1}},它始终假设你使用false
。您不能使用Foolproof验证属性。
答案 1 :(得分: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未实现的值,而RequiredIfFalse用于检查是否提供了值,我认为它正在检查字段值是否为false。感谢@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,它也能正常工作。
答案 2 :(得分:0)
[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;
}