什么是 ModelState.IsValid 有效的 ASP.NET MVC 在 Nerd逗留?

书呆子晚餐的例子 专业 ASP.NET MVC 1.0有一个方法来创建一个新的晚餐复制下面(第89页的免费书呆子晚餐版本)。

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

在提交表单时,如果在日期中出现错误,ModelState.IsValid 将为 false,并且您将返回一个错误,但是这个错误只针对日期,因为从未执行过 AddRule 。如果您完全删除了 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);
}
312956 次浏览

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

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

样例 DataAnnotations模型绑定器将使用从模型上的 DataAnnotations属性获取的验证错误填充模型状态。

来自勘误表: 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

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

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

而不是

ModelState.AddRuleViolations(dinner.GetRuleViolations());

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