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

pup*_*eno 140 validation asp.net-mvc nerddinner

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); 
} 
Run Code Online (Sandbox Code Playgroud)

Bra*_*son 137

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

默认模型绑定器将为基本类型转换问题添加一些错误(例如,为非"数字"传递非数字).您可以根据您使用的任何验证系统更完整地填充ModelState.

样本DataAnnotations模型绑定器将填充模型状态,并从DataAnnotations模型中的属性获取验证错误.

  • 使用:`var errors = ModelState.Values.SelectMany(v => v.Errors);`带有断点以查看任何验证问题. (13认同)

小智 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

  • 截至2017年,存在非复数的"ModelState.AddModelError"方法. (6认同)
  • 截至2015年,"AddModelErrors"方法不存在. (5认同)
  • 截至2016年,存在`ModelState.AddModelErrors()`方法 (5认同)