MVC中ModelState类需要引用 System.Web.Mvc命名空间,在 System.Web.Mvc.dll 中。

属性

Errors

返回一个 ModelErrorCollection 对象,该对象包含在模型绑定期间发生的任何错误。

Value

返回一个 ValueProviderResult 对象,该对象封装在模型绑定期间绑定的值。

Html 辅助方法和ModelState集成

HTML 辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误,将呈现用户输入的内容和CSS错误类。
 
例如,在Edit视图中,我们使用Html.TextBox() 辅助方法呈现Dinner对象的EventDate属性:
 
<%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>
 
当有错的时候呈现视图时,Html.TextBox() 方法检查ModelState集合,检查是否有错误关联到Dinner 对象的EventDate属性。当发现有错误时,将显示用户提交的”EntLib” 输入作为参数值,同时对<input type=”textbox” />元素添加CSS 错误类,如下所示:
 
<input class="input-validation-error" id="EventDate" name="EventDate"
type="text" value="BOGUS" />
 
你可以定制CSS错误类的样式。默认的CSS错误类 – input-validation-error定义在\content\site.css 文件中,样式定义如下:
 
.input-validation-error
{
border: 1px solid #ff0000;
 
}
 
 
 
Html.ValidationMessage() 辅助方法
 
Html.ValidationMessage() 辅助方法用来输出特定Model属性相关的ModelState错误信息:
 
<%= Html.ValidationMessage("EventDate") %>
 
上述代码输出:
 
<span class=”field-validation-error”> The value ‘EntLib’ is invalid</span>
 
Html.ValidationMessage() 辅助方法也支持第二个参数,允许开发人员覆盖错误消息:
 
<%= Html.ValidationMessage("EventDate", "*") %>
 
 
上述代码输出:
 
<span class=”field-validation-error”> *</span>,而不是默认的错误信息。
 
 
 
Html.ValidationSummary() 辅助方法
 
Html.ValidationSummary() 辅助方法将呈现总结的错误消息,通过<ul><li/></ul>元素列出在ModelState集合中所有详细的错误消息
 
Html.ValidationSummary() 辅助方法接收一个可选的字符串参数 – 定义一个概括性的错误消息,并显示在所有详细错误信息的前面:
 
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
 
 
你也可以定义CSS设置错误消息的样式。
 
 
 
使用AddRuleViolations辅助方法
 
初始的HTTP-POST Edit的实现方法使用了一个foreach循环语句,遍历Dinner对象的Rule Violations,并添加到controller的ModelState集合:
 
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
 
为了使代码更简洁一点,我们添加ControllerHelpers类到NerdDinner项目中,并实现了AddRuleViolations扩展方法,添加了一个对ASP.NET MVC ModelStateDictionary 类的辅助方法。该扩展方法封装了使用RuleViolation 错误信息填充ModelStateDictionary 集合类的逻辑:
 
public static class ControllerHelpers
{
public static void AddRuleViolations(this ModelStateDictionary modelState,
IEnumerable<RuleViolation> errors)
{
foreach (RuleViolation issue in errors)
{
modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
 
接下来,我们更新HTTP-POST Edit方法,使用上述扩展方法实现Dinner的Rule Violations填充ModelState集合。
 
 
 
完成Edit Action方法的实现
 
 
下面的代码实现了控制器中Edit的所有逻辑:
 
 
C# 代码   复制

//
// GET: /Dinners/Edit/2
public ActionResult Edit(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
return View(dinner);
}

//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);

try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(dinner);
}
}
 
关于Edit方法的实现的优点,不仅Controller类,而且View视图模板都不必关心Dinner模型类的特定验证方法或者业务规则。以后,我们可以针对Model类增加额外的业务规则,而不必要求Controller和View更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。

MVC中modelstate的使用的更多相关文章

  1. mvc中服务器端、客户端属性验证

    在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证: 我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解(System.Component ...

  2. MVC中的默认Model绑定者DefaultModelBinder

    一.题外话 接续上一篇: MVC中Action参数绑定的过程 public IModelBinder DefaultBinder { get { if (this._defaultBinder == ...

  3. MVC中Action参数绑定的过程

    一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...

  4. Asp.Net MVC中DropDownListFor的用法(转)

    2016.03.04 扩展:如果 view中传入的是List<T>类型 怎么使用 DropList 既然是List<T> 那么我转化成 T  List<T>的第一个 ...

  5. MVC中数据的内部校验

    针对MVC中实例类型的修饰,我们可以采用DataAnnotations类来完成,该类所处的命名空间是System.ComponentModel.DataAnnotations; 一.通过开类型,能够修 ...

  6. MVC中Form表单的提交

    概述 Web页面进行Form表单提交是数据提交的一种,在MVC中Form表单提交到服务器.服务端接受Form表单的方式有多种,如果一个Form有2个submit按钮,那后台如何判断是哪个按钮提交的数据 ...

  7. Asp.Net MVC中DropDownListFor的用法

    在Asp.Net MVC中可以用DropDownListFor的方式来让用户选择已定列表中的一个数值.用法不复杂,这里简单做一个记录. 首先我们要定义一个 Model ,用户在 DropDownLis ...

  8. 在ASP.NET MVC中对手机号码的验证

    在ASP.NET MVC中,可以使用RegularExpression特性来验证手机号码. public class Customer { [Required(ErrorMessage = " ...

  9. MVC中使用EF(2):实现基本的CRUD功能

    MVC中使用EF(2):实现基本的CRUD功能 By  Tom Dykstra |July 30, 2013 Translated by litdwg   Contoso University示例网站 ...

随机推荐

  1. 【Linux高频命令专题(23)】tar

    概述 通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为li ...

  2. Filter高级开发

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十三)——Filter高级开发 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以 ...

  3. ADO.NET基础02(语句参数化,配置文件,DataSet与DataTable)

    ADO.NET连接池 ado.net默认启用了连接池 *如何清空连接池?Connection的静态方法ClearAllPools(). ClearPool() Ado.net连接池使用总结: 1.第一 ...

  4. ADO.NET入门教程(三) 连接字符串,你小觑了吗?

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/12/2347914.html 摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问 ...

  5. latex 三线表

    LaTeX 处理三线表相当简单方便.用到的宏包主要是 booktabs .代码如下: 需要添加包:\usepackage{booktabs}. \documentclass{article} \use ...

  6. Linux /bin、/sbin、/usr/bin、/usr/sbin目录的区别

    在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件一般如下:     bin目录:  bin为binary的简写主要放置一些 ...

  7. web rest api tools

    https://chrome.google.com/webstore/search/postman-REST%20Client

  8. Redis安装教程

    1. Linux下Redis安装教程 (1)安装 #tar xf redis-2.6.14.tar.gz #cd redis-2.6.14 #make #make install (2)配置 修改re ...

  9. Catalog与Schema

    按照SQL标准的解释,在SQL环境下Catalog和Schema都属于抽象概念,可以把它们理解为一个容器或者数据库对象命名空间中的一个层次,主要用来解决命名冲突问题.从概念上说,一个数据库系统包含多个 ...

  10. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...