NerdDinner的ASP.NET MVC中有效的ModelState.IsValid是什么?


148

Professional ASP.NET MVC 1.0NerdDinner示例中,有一种方法可以创建一个新的晚宴,如下所示(免费的NerdDinner版本的第89页)。

在那里检查ModelState.IsValid是否为true。似乎正在检查模型是否对数据库有效(也就是说,它会捕获数据类型转换,例如格式无效的日期,而不是业务规则)。真的吗?

提交表单时,如果日期中有错误,则ModelState.IsValid为false,并且会返回错误,但仅针对该日期,因为从未执行过AddRuleViolations。如果完全删除对ModelState.IsValid的检查,则将获得所有错误(由于异常),包括无效日期的标记。然后,为什么根本不检查ModelState.IsValid?我想念什么吗?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

Answers:


143

ModelState.IsValid告诉您是否已向中添加任何模型错误ModelState

默认的模型绑定程序将为基本的类型转换问题添加一些错误(例如,为“ int”的值传递非数字)。您可以根据所使用的任何验证系统更完全地填充ModelState。

样本DataAnnotations模型绑定程序将使用来自DataAnnotations模型属性的验证错误填充模型状态。


布拉德有什么方法可以找出是否用不带ModelState的DataAnnotations“ IsValid”装饰的Model。(例如,从文件加载对象或在控制台应用程序中使用对象等)
runxc1 Bret Ferrier 2011年

1
不,ModelState.IsValid是了解模型绑定期间是否存在任何验证(或数据转换)错误的唯一方法。
布拉德·威尔逊

@Brad,当您说“您可以根据所使用的验证系统更完全地填充ModelState”时,该如何完成?有没有办法为我的ViewModel破解我的ModelState验证代码?我使用的是EF4,因此我的大部分验证都是开箱即用的。
WEFX

13
使用:var errors = ModelState.Values.SelectMany(v => v.Errors);带有断点以查看任何验证问题。
full_prog_full 2015年

如果属性名称已更改,未执行迁移以及因此SaveChanges(),有时在相关表中会出现错误。失败,并且由于更改而不会发生。
Oracular Man '18

25

从勘误表中: ModelState.AddRuleViolations(dinner.GetRuleViolations());

应该:

ModelState.AddModelErrors(dinner.GetRuleViolations());

参考:http : //www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
截至2015年,该AddModelErrors方法不存在。
费利佩·科雷亚

6
截至2016年,该ModelState.AddModelErrors()方法已存在
John

7
截至2017年,ModelState.AddModelError存在非复数方法。
Zachafer '17

0

是的,Jared和Kelly Orr是对的。我在编辑异常中使用以下代码。

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

代替

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

所有具有确定类型的模型字段,返回给Controller时应进行验证。如果任何模型字段与其定义的类型都不匹配,则ModelState.IsValid将返回false。因为,这些错误将被添加到ModelState中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.