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基础--分类与合并命令

    1.sortsort命令将许多不同的域按不同的顺序分类,sort命令的一般格式为: sort -cmu -o output_file [other options] +pos1 +pos2 input ...

  2. java c# 加密与解密对照

    原文 java c# 加密与解密对照 最近一直烦恼,java , c# 加密的不同,然后整理了一下,留个备份的轮子: 其中在 java.c#加密转换时,最重要的是 IV 的确定,我常常用如下方法使得j ...

  3. Filter过滤非法字符

    示例:定义一个Filter,用于用户发言中出现的“晕”字,即如果没有这个字则允许发言,如果有这个字则不允许发言并提示错误. CharForm.jsp <%@ page language=&quo ...

  4. 一个zip压缩类,欢迎吐槽

    package com.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import j ...

  5. HDU 4351 Digital root 线段树区间合并

    依然不是十分理解……待考虑…… #include <cstdio> #include <cstring> #include <cstdlib> #include & ...

  6. command-t插件使用说明

    类似于SourceInsight的Project Window,快速浏览项目里的文件 \t或:CommandT打开该插件 g:CommandTTraverseSCM设置搜索工程的根目录 tab在提示窗 ...

  7. ASP.NET中如何删除最近打开的项目和文件的记录

    ASP.NTET中总是保留最近打开的项目和文件的记录,甚至是已删除的它也不删.下面介绍几种删除的方法: 第一种:建立一个bat文件,以后双击即可清除,内置代码如下: @echo off@REG Del ...

  8. drop.delete.trauncat的区别

    delete删除数据,保留表结构,可以回滚,如果数据量大,很慢,回滚是因为备份了删除的数据(删除数据时有两个动作,删除和备份) truncate删除所有数据,保留表结构,不可以回滚,一次全部删除所有数 ...

  9. BZOJ2151: 种树

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 题解:此题=数据备份.喜闻乐见挂链表. 代码: #include<cstdio&g ...

  10. [POJ 3498] March of the Penguins

    March of the Penguins Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 4378   Accepted:  ...