Aar*_*ron 3 validation asp.net-mvc
我有一个FilesModel
用于更新字符串的简单模型Description
和Archived
一些(已上载的)文件的复选框的布尔值,并且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)
事实证明,复选框是整个问题.我在代码的其他地方找到了解决这个问题的方法,所以我使用了它.这似乎有点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
.
归档时间: |
|
查看次数: |
1877 次 |
最近记录: |