通过向控制器提供时间控制,MVC验证器错误消失

Aar*_*ron 3 validation asp.net-mvc

我有一个FilesModel用于更新字符串的简单模型DescriptionArchived一些(已上载的)文件的复选框的布尔值,并且FilesModel具有在FilesModelValidator发布此数据时运行的验证器.此验证器只会检查每个文件是否有描述.我知道它运行并正确返回基于我的调试到目前为止的空描述的错误.

但是,当控制器中的Action方法被赋予控制权时,ModelState与我期望的不同.描述字段中没有错误,但每个选中的复选框都有一个错误:"值'on'对于Archived无效."

这种验证在网站的其他区域运行得很好,所以我确定我会忽略一些微小的事情.有关为什么会发生这种情况以及如何解决这个问题的任何建议?

验证器

public FilesModelValidator()
{
    RuleFor(f => f.Files)
        .Must(AllHaveADescription).WithMessage("Must have a description");
}

public static bool AllHaveADescription(Files files)
{
    // This is run on postback, and returns false when any Description is empty
    return files.All(f => f.Description != null && f.Description.Length > 0);
}
Run Code Online (Sandbox Code Playgroud)

调节器

[HttpPost]
public virtual ActionResult Update(FilesModel model)
{
    // At this point, ModelState contains an error for each checked checkbox
    // and no errors for empty descriptions
    if (ModelState.IsValid)
    {
        // Save
    }
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

Aar*_*ron 8

事实证明,复选框是整个问题.我在代码的其他地方找到了解决这个问题的方法,所以我使用了它.这似乎有点hacky,但它确实有效.

这个想法是你需要确保复选框的值是,true而不是"打开".这样做:

<input type="checkbox" id="myCheckbox" value="true" />
Run Code Online (Sandbox Code Playgroud)

然后false在复选框后面添加一个具有相同id的隐藏输入及其值:

<input type="hidden" id="myCheckbox" value="false" />
Run Code Online (Sandbox Code Playgroud)

如果未选中复选框,则复选框值不会回发到服务器.因此,当回发发生时,服务器会看到myCheckbox=false在这种情况下我们想要的是什么.当该复选框选中,这两个输入值能张贴到服务器.但是服务器只使用第一个值(这是复选框本身的值,因为我们将它放在隐藏字段之前).所以服务器看到了myCheckbox=true.