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

时间:2015-06-08 12:16:51

标签: asp.net-mvc-5 foolproof-validation

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

3 个答案:

答案 0 :(得分:1)

布尔值只有2个状态(truefalse),其中任何一个都有效,因此[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;
}