在服务器端验证中,有时我们添加了一个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. HDU 2579 (记忆化BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2579 题目大意:走迷宫.对于障碍点,只有当前(dep+1)%k才能走,问最少时间. 解题思路: 只有 ...

  2. 添加Bootstrap 到MVC项目中(vs2010)

    环境:Visual Studio 2010   ASP.NET MVC3 手动添加: 下载地址:http://twitter.github.com/bootstrap/ 一个js,两个css,两张图 ...

  3. How to Programmatically Switch between the HubTile Visual States

    In this post I am going to talk about how to programmatically switch between different HubTile Visua ...

  4. wp7 中 HubTile控件自定义大小。

    http://blog.csdn.net/matrixcl/article/details/7057291 (转) Toolkit(http://silverlight.codeplex.com/)中 ...

  5. vim molokai配色方案(调过)

    " Vim color file " " Author: Tomas Restrepo <tomas@winterdom.com> " " ...

  6. iOS-TextField知多少

    iOS-TextField知多少 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRect ...

  7. [百科] - CreatePen()

    CreatePen编辑[声明]HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);[说明]用指定的样式.宽度和颜色创建一个画笔[参数 ...

  8. 《GK101任意波发生器》升级固件发布(版本:1.0.2build198)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build198 编译日期:2014-09-17 ====================================== 二. ...

  9. node系列:琐碎备忘

    cmd 全局与本地路径 查看:默认 查看本地路径:npm config get cache,默认和nodejs安装目录同一目录 查看全局路径:npm config get prefix,默认c盘app ...

  10. discuz怎么根据连接知道调用的是什么模板页面

    其实不怎么难,基本都可以看出discuz是怎么样调用模板页面的 这个是论坛的帖子的列表页,看到url就可以看出是forum目录下的forumdisplay这个模板,forumdisplay.html这 ...