在Professional ASP.NET MVC 1.0的NerdDinner示例中,有一个方法可以创建一个新的晚餐,如下所示(免费NerdDinner版本的第89页)。
在那里,它检查ModelState.IsValid是否为真。它似乎检查模型对于数据库是否有效(即,它捕获数据类型转换,如格式无效的日期,但不是业务规则)。这是真的吗?
提交表单时,如果日期中有错误,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);
}
发布于 2009-05-19 07:07:39
ModelState.IsValid
会告诉您是否已将任何模型错误添加到ModelState
中。
默认的模型绑定器将为基本的类型转换问题添加一些错误(例如,为某个“int”类型传递一个非数字)。您可以基于所使用的任何验证系统更完整地填充ModelState。
示例DataAnnotations
模型绑定器将使用从模型的DataAnnotations
属性中获取的验证错误来填充模型状态。
发布于 2009-07-14 02:20:19
来自勘误表:ModelState.AddRuleViolations(dinner.GetRuleViolations());
应该是:
ModelState.AddModelErrors(dinner.GetRuleViolations());
发布于 2020-02-23 03:38:26
所有有明确类型的模型字段,需要在返回给Controller时进行验证。如果有任何模型字段与其定义的类型不匹配,则ModelState.IsValid将返回false。因为,这些错误将被添加到ModelState中。
https://stackoverflow.com/questions/881281
复制相似问题