149

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); 
} 
4

4 回答 4

152

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

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

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

于 2009-05-19T07:07:39.383 回答
26

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

于 2009-07-14T02:20:19.447 回答
1

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

于 2020-02-22T19:38:25.560 回答
0

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

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

代替

ModelState.AddRuleViolations(dinner.GetRuleViolations());
于 2018-03-11T17:12:41.287 回答