代码之家  ›  专栏  ›  技术社区  ›  Aaron

MVC验证器错误在控制器得到控制时消失。

  •  3
  • Aaron  · 技术社区  · 14 年前

    我有一个简单的模型 FilesModel 用于更新字符串 Description 以及复选框的布尔值 Archived 一些(已经上传的)文件,以及 文件模型 有验证器 FilesModelValidator 在发布此数据时运行。这个验证器只检查每个文件是否都有描述。我知道它会运行,并且根据我目前的调试结果正确地返回空描述的错误。

    但是,当控制器中的action方法得到控制时,ModelState与我期望的不同。描述字段上没有错误,但选中的每个复选框都有一个错误:“值'on'对于存档无效。”

    这种类型的验证在站点的其他区域工作得很好,所以我确信我忽略了一些微小的事情。关于为什么会发生这种情况以及如何解决它,有什么建议吗?

    验证器

    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);
    }
    

    控制器

    [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);
    }
    
    3 回复  |  直到 12 年前
        1
  •  8
  •   Aaron    14 年前

    结果是复选框问题就是整个问题。我在代码的其他地方找到了这个问题的解决方案,所以我使用了它。这看起来有点老土,但很管用。

    您需要确保复选框的值为 true 而不是“on”。这样做:

    <input type="checkbox" id="myCheckbox" value="true" />
    

    然后添加一个具有相同ID的隐藏输入,其值为 false 复选框后立即:

    <input type="hidden" id="myCheckbox" value="false" />
    

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

        2
  •  3
  •   GDP Danny    12 年前

    我在视图中使用了以下内容,而不是手动创建复选框:

    Html.CheckBox("FieldName")
    
        3
  •  0
  •   griegs    14 年前

    对于链接到枚举的下拉列表中的项,我有相同的问题。我去掉了默认值,所以当有人没有选择某个值时,我得到了一个错误。

    所以,说了这句话,我认为你的问题可能有点关联,因为当你的模型预测是/否或者相反的时候,活页夹正在寻找一个正确/错误。

    解决这个问题的两种方法可能是将您的视图更改为true/false,或者,这就是我所做的,编写自己的modelbinder,将其从yes转换为true。

    希望这对你有所帮助。