什么是 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?
c# -ModelState.IsValid 仅在资源语言更改时返回 false?
ASPNET MVC - 当该字段确实有值时,为啥 ModelState.IsValid false“需要 x 字段”?