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

Posted

技术标签:

【中文标题】什么是 ModelState.IsValid 在 NerdDinner 的 ASP.NET MVC 中有效?【英文标题】:What is ModelState.IsValid valid for in ASP.NET MVC in NerdDinner? 【发布时间】:2010-10-27 05:55:41 【问题描述】:

在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); 
 

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

Brad 有没有办法找出一个没有 ModelState 的用 DataAnnotations "IsValid" 装饰的模型。 (例如,对象是从文件加载或在控制台应用程序中使用等) 否,ModelState.IsValid 是了解模型绑定期间是否存在任何验证(或数据转换)错误的唯一方法。 @Brad,当您说“您可以根据您使用的任何验证系统更充分地填充 ModelState”时,这是如何实现的?有没有办法破解我的 ViewModel 的 ModelState 验证代码?我使用的是 EF4,所以我的大部分验证都是开箱即用的自动验证。 使用:var errors = ModelState.Values.SelectMany(v => v.Errors); 和一个断点来查看任何验证问题。 如果属性名称已更改、未执行迁移并因此导致 SaveChanges();失败并且由于更改而无法发生。【参考方案2】:

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

【讨论】:

截至 2015 年,AddModelErrors 方法不存在。 截至 2016 年,存在 ModelState.AddModelErrors() 方法 截至 2017 年,存在非复数 ModelState.AddModelError 方法。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

foreach (var issue in dinner.GetRuleViolations())

    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);

代替

ModelState.AddRuleViolations(dinner.GetRuleViolations());

【讨论】:

以上是关于什么是 ModelState.IsValid 在 NerdDinner 的 ASP.NET MVC 中有效?的主要内容,如果未能解决你的问题,请参考以下文章

我如何只能使用 ModelState.IsValid 检查一个模型

如何使用 Moq 框架模拟 ModelState.IsValid?

modelstate.isvalid false

c# -ModelState.IsValid 仅在资源语言更改时返回 false?

ModelState.IsValid忽略型别的检查错误

ASPNET MVC - 当该字段确实有值时,为啥 ModelState.IsValid false“需要 x 字段”?