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

时间:2009-05-19 06:42:44

标签: asp.net-mvc validation nerddinner

NerdDinnerProfessional ASP.NET MVC 1.0示例中,有一种创建新晚餐的方法,如下所示(免费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); 
} 

4 个答案:

答案 0 :(得分:134)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

代替

ModelState.AddRuleViolations(dinner.GetRuleViolations());