在服务器端验证中,有时我们添加了一个ModelError,然后还需要将该信息以JS的形式返回到客户端。如:

[HttpPost]
public ActionResult Index(LogOnModel model)
{
if (string.IsNullOrEmpty(model.UserName))
{
ModelState.AddModelError("UserName", "请输入用户名。");
return JavaScript("alert('请输入用户名')");
}
if (string.IsNullOrEmpty(model.PassWord))
{
ModelState.AddModelError("UserName", "请输入密码。");
return JavaScript("alert('请输入密码')");
}
if (string.IsNullOrEmpty(model.CheckCode))
{
ModelState.AddModelError("UserName", "请输入验证码。");
return JavaScript("alert('请输入验证码')");
}
if (ModelState.IsValid)
{
Response.Write("asdf");
}
return View();
}

这样重写一遍固然可以,但却做了重复的工作,如果我们能获取添加在ModelState中的错误信息,则可以省去不少的工作。

ModelState本身是一个字典,并且存储了验证失败的信息。具体被存储在ModelState.Values[i].Errors[j].ErrorMessage属性中。

ModelState的Errors属性存储了所有验证失败信息,是一个ModelErrorCollection类型,ModelErrorCollection是一个ModelError的集合,而ModelError的ErrorMessage属性包含了验证失败错误信息。

大致是这样:

○ ModelStateDictionary实际上是IDictionary<string, ModelState>类型
○ ModelState.Errors属性实际上是ModelErrorCollection类型
○ ModelErrorCollection实际上是ICollection<ModelError>类型
○ ModelError.ErrorMessage属性存储着所有验证失败信息

接下来的工作,其实就是如何把这个验证信息找出来。我们先手工添加一条验证信息,然后试图显示它:

ModelState.AddModelError("UserName", "请输入用户名。");
return JavaScript("alert('" + ModelState.Values.First().Errors[].ErrorMessage + "')");

上面的代码中,Values集合表示的为不同的键值,而Errors则表示同一键值下的不同信息。

ModelState.AddModelError("UserName", "请输入用户名。");
ModelState.AddModelError("UserName", "用户名不正确。");
ModelState.AddModelError("PassWord", "请输入密码。");
ModelState.AddModelError("PassWord", "密码不正确。");
//输出第一条
return Content(ModelState.Values.First().Errors[].ErrorMessage);
//输出第二条
return Content(ModelState.Values.First().Errors[].ErrorMessage);
//输出第三条
return Content(ModelState.Values.Skip().First().Errors[].ErrorMessage);
//输出第四条
return Content(ModelState.Values.Skip().First().Errors[].ErrorMessage);

清楚了这些,遍历一个ModelState也就不难了。

                StringBuilder errinfo = new StringBuilder();
foreach (var s in ModelState.Values)
{
foreach (var p in s.Errors)
{
errinfo.AppendFormat("{0}\\n", p.ErrorMessage);
}
} return JavaScript("alert('" + errinfo.ToString() + "')");

以下分别是集中显示错误信息和依次显示错误信息的代码:

集中显示错误信息:

[HttpPost]
public ActionResult Index(LogOnModel model)
{
if (string.IsNullOrEmpty(model.UserName))
{
ModelState.AddModelError("UserName", "请输入用户名。");
}
if (string.IsNullOrEmpty(model.PassWord))
{
ModelState.AddModelError("PassWord", "请输入密码。");
}
if (string.IsNullOrEmpty(model.CheckCode))
{
ModelState.AddModelError("ChkCode", "请输入验证码。");
}
if (!ModelState.IsValid)
{
StringBuilder errinfo = new StringBuilder();
foreach (var s in ModelState.Values)
{
foreach (var p in s.Errors)
{
errinfo.AppendFormat("{0}\\n", p.ErrorMessage);
}
}
return JavaScript("alert('" + errinfo.ToString() + "')");
}
return View();
}

依次逐条显示错误信息:

[HttpPost]
public ActionResult Index(LogOnModel model)
{
if (string.IsNullOrEmpty(model.UserName))
{
ModelState.AddModelError("UserName", "请输入用户名。");
return JavaScript("alert('" + ModelState.Values.First().Errors[].ErrorMessage + "')");
}
if (string.IsNullOrEmpty(model.PassWord))
{
ModelState.AddModelError("UserName", "请输入密码。");
return JavaScript("alert('" + ModelState.Values.First().Errors[].ErrorMessage + "')");
}
if (string.IsNullOrEmpty(model.CheckCode))
{
ModelState.AddModelError("UserName", "请输入验证码。");
return JavaScript("alert('" + ModelState.Values.First().Errors[].ErrorMessage + "')");
}
if (ModelState.IsValid)
{ }
return View();
}

遍历ModelState中存储的错误信息的更多相关文章

  1. JAVA 在程序中存储和修改信息

    1.语句和表达式 计算机程序是一组告诉计算机什么的指令,每一个指令称为语句. 2.指定变量类型 变量名.变量存储的信息类型 整型int(-2.14*109~2.14*109).浮点型float(38位 ...

  2. windows下cmd时复制dos中的内容 错误信息等

    16:28 2015/11/23小发现 windows下cmd时复制dos中的内容,错误信息等:鼠标右键选择标记,然后ctrl c 即可.

  3. ASP.Net MVC3/4中Model验证错误信息的本地化

    最近使用ASP.Net MVC4做一个B/S的管理系统,里面有N多的Action和View Model,View Model上又有N多的验证. 一开始写的时候虽然知道要实现多语言,但是没有过多考虑,本 ...

  4. 使用selenium遍历frame中的表单信息 ;

    遍历frame中的表单 : package webDriverPro; import java.util.List; import java.util.regex.Matcher; import ja ...

  5. 获取jwt(json web token)中存储的用户信息

    一个JWT实际上就是一个字符串,它由三部分组成,头部(header).载荷(Payload)与签名. Payload payload中可以保存用户的信息. var claims = new Claim ...

  6. spring boot中实现security错误信息本地化

    一.修改messages.properties 找源码中的messages.properties,复制一份放在classpath下,修改你要修改的内容 AbstractUserDetailsAuthe ...

  7. 统一处理jquery ajax请求过程中的异常错误信息的机制

    当jQuery ajax向服务器发送请求,服务器发生异常,比如:400.403.404.500等异常,服务器将异常响应给客户端,此时的ajax可以获取异常信息并进行处理,但此时我们一般是跳转到与异常编 ...

  8. allegro导入网表过程中出现的错误信息

    1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...

  9. 在junit格式的结果信息中只包含错误信息的修改方法

    文件名称:suiteJunit.vm 文件路径:src\fitnesse\resources\templates 添加如下黑体部分内容: <?xml version="1.0" ...

随机推荐

  1. ural 1157. Young Tiler

    1157. Young Tiler Time limit: 1.0 secondMemory limit: 64 MB One young boy had many-many identical sq ...

  2. ! cocos2d 同一个sprite的触控问题

    如果对一个A sprite添加触控,然后在一个场景中创建四个A的实例,那么1234逐个添加的话,只有最后一个会被点击到.其他的将不会响应.

  3. BZOJ4068 : [Ctsc2015]app

    对于一个所选任务集合,如果对于任意时刻$i$,$i$前面所选任务数都不超过i的话,那么这些任务可以全选. 维护一棵线段树$T$,第$i$个位置一开始为$i$,每使用一个任务,$[t,T]$都要减$1$ ...

  4. 使用HttpsURLConnection发送POST请求

    重写X509TrustManager private static TrustManager myX509TrustManager = new X509TrustManager() { @Overri ...

  5. CC150 - 11.1

    Question: You are given two sorted arrays, A and B, where A has a large enough buffer at the end to ...

  6. 小结:ac自动机

    复杂度: 查找O(n),维护O(n) 概要: 应用了kmp的自匹配思想,在trie建图时维护一个fali指针,指向上一个匹配的点,这点是用bfs做到.匹配串的时候同样没匹配到就和kmp一样返回. 应用 ...

  7. FreeMarker教程

    一.什么是模板引擎,为什么要用模板引擎 在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面.风格.布局.效果等等可视元素:而程序员则忙于创建程式的商业流程 ...

  8. Odoo ir value 分析

    源代码位置:openerp/addons/base/ir/ir_values.py _columns = { 'name': fields.char('Name', required=True), ' ...

  9. Scala _ [underscore] magic

    I started learning Scala a few days before. Initially i was annoyed by the use of too many symbols i ...

  10. javascript获取随机数的几种方式

    //获取0-num的随机数 function randomNum(num){ return Math.floor(Math.random()*num); } //获取start-end的随机数 fun ...