http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3

ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。我以MVC3项目模板自带的登录 做例子讲解Model的验证。

一、启用客户端验证:

客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。

第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了:

<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

然后在被验证的View页面上要加入这样两个JavaScript,注意,他们是依赖于JQuery的:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

验证消息的显示有两种,一种是ValidationSummary,它可以显示一份验证消息的汇总,包括从后台Action里返回的消息。

@Html.ValidationSummary(true"Login was unsuccessful. Please correct the errors and try again.")

另一种是Model中各属性对应HTML控件的验证消息:

@Html.ValidationMessageFor(m => m.UserName)

二、在Model中加入验证标记

MVC3项目模板自带的登录模型类如下:

public class LogOnModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { getset; }
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { getset; }
    [Display(Name = "Remember me?")]
    public bool RememberMe { getset; }
}

对比普通的C#类,我们发现每个属性上都多了被方括号“[]”包围的标记。其中,[Required]是验证标记的一种,而[Display]、[DataType]则是为了显示对应的HTML控件,这不在本文讨论范围之内。

除了Required,我们还可以在Model中添加其他有用的验证标记。下面是个较完整的列表:

Model类中可以添加的验证标记:

1. 必填字段

[Required]

public string FirstName { get; set; }

2. 字段长度

至多n位:

[StringLength(160)]

public string FirstName { get; set; }

要求至少n位:

[StringLength(160, MinimumLength=3)]

public string FirstName { get; set; }

3. 正则验证

[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]

public string Email { get; set; }

4. 范围

[Range(35,44)]

public int Age { get; set; }

小数的情况:

[Range(typeof(decimal), “0.00”, “49.99”)]

public decimal Price { get; set; }

5. 服务端参与的验证

[Remote(“CheckUserName”, “Account”)]

public string UserName { get; set; }

然后在AccountController里指定一个CheckUserName方法:

public JsonResult CheckUserName(string username)
{
    var result = Membership.FindUsersByName(username).Count == 0;
    return Json(result, JsonRequestBehavior.AllowGet);
}

6. 比较

[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]

public string Email { get; set; }

[Compare(“Email”)]

public string EmailConfirm { get; set; }

7. 自定义错误消息

正则:

[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”,

ErrorMessage=”Email doesn’t look like a valid email address.”)]

public string Email { get; set; }

普通文本:

[Required(ErrorMessage=”Your last name is required”)]

[StringLength(160, ErrorMessage=”Your last name is too long”)]

public string LastName { get; set; }

占位符:

[Required(ErrorMessage=”Your {0} is required.”)]

[StringLength(160, ErrorMessage=”{0} is too long.”)]

public string LastName { get; set; }

三、后台Action的写法

Action里要做的有两件事:判断ModelState是否合法、添加错误消息。MVC3模板自带的登录Action如下:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index""Home");
            }
        }
        else
        {
            ModelState.AddModelError("""The user name or password provided is incorrect.");
        }
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

[HttpPost]表示这个Action只能通过POST动作调用,这是为了配合View里的表单,因为FORM的ACTION是POST(当然也可以是GET),不过这不在本文的讨论范围内。

if (ModelState.IsValid) 是重点,如果不出意外,即客户端浏览器没有关闭JavaScript,并且客户不是个黑客(黑客可能会通过一些工具模拟POST),那只要通过正常途径 POST到这个Action的Model都应该是IsValid的。当然,编程的一个重要原则是不能相信用户的输入,所以我们有必要再判断一次 ModelState.IsValid。

ModelState.AddModelError方法是给View返回一个错误消息,最终交给@Html.ValidationSummary显示。

最后附上常用正则表达式(网上找的)

数字:"^[0-9]*$"。

n位的数字:"^\d{n}$"。

至少n位的数字:"^\d{n,}$"。

m~n位的数字:。"^\d{m,n}$"

零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

非零的正整数:"^\+?[1-9][0-9]*$"。

非零的负整数:"^\-[1-9][]0-9"*$。

长度为3的字符:"^.{3}$"。

由26个英文字母组成的字符串:"^[A-Za-z]+$"。

由26个大写英文字母组成的字符串:"^[A-Z]+$"。

由26个小写英文字母组成的字符串:"^[a-z]+$"。

由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

验证是否含有^%&’,;=?$\"等字符:"[^%&’,;=?$\x22]+"。

只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"

验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。

验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。

验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。

转载于:https://www.cnblogs.com/q4486233/p/3956453.html

ASP.NET MVC3 Model验证总结相关推荐

  1. ASP.NET MVC3 Model验证总结 @Html.ValidationSummary(true)

    http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3 ASP.NET MVC3中的Model是自验证的,这是通 ...

  2. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源:http://www.byywee.com/page/M0/S868/868615.html关于Model验证官方资料:http://msdn.microsoft.com/zh-cn ...

  3. 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。

    最近几天看了一下Asp.net MVC2的model验证,初始的感觉让我眼前一亮,于是去看了看它的源代码,Validation和Metadata部分应该是从Dynamic Data哪里得到的灵感,一切 ...

  4. ASP.NET MVC3 权限验证

    微软今年发布了 MVC3,以前接触过JAVA中的SSH,感觉思想不错,非常喜欢Struts2中的拦截器的概念,因为做程序也没多久所以一直没机会在WebForm中研究下如何实现IOC及AOP,看到了MV ...

  5. ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator

    对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute.通过<ASP.NET MVC以Mo ...

  6. ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator

    旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证.借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的 ...

  7. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来 ...

  8. ASP.NET MVC3书店--第七节 用户及身份验证(转)

    http://blog.sina.com.cn/s/blog_6ad539a90100r7jx.html 现在的问题是任何用户都可以通过StoreManager控制器来访问我们的书籍管理页面.接下来让 ...

  9. ASP.NETMVC Model验证(五)

    ASP.NETMVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider和ModelValidator两种类型的自定义实现,然而在MVC框架中还给我们提供了其它方式来 ...

  10. [ASP.NET MVC 小牛之路]16 - Model 验证

    上一篇博文 [ASP.NET MVC 小牛之路]15 - Model Binding 中讲了MVC在Model Binding过程中如何根据用户提交HTTP请求数据创建Model对象.在实际的项目中, ...

最新文章

  1. 直接对梯度下手,阿里达摩院提出新型优化方法,一行代码即可替换现有优化器...
  2. 怎样让电脑速度变快_双11的笔记本电脑怎么买?哪些轻薄款的最好?
  3. 关于手动栈 (模板)
  4. python创建多个文件_Python创建文件夹与文件的快捷方法
  5. Qt4_Shreadsheet电子表应用
  6. 用自己的算法实现startsWith和endsWith功能
  7. ajax点击事件click触发两次,jQuery点击click触发两次事件解决办法
  8. Linux 触摸屏 笔记本,Linux 5.2应该可以解决许多AMD Ryzen笔记本电脑触摸屏/触摸板无法工作的问题...
  9. 华为云Bu【nononoknow】
  10. 【二维码识别】灰度+二值化+校正二维码生成与识别【含GUI Matlab源码 635期】
  11. linux下jdk安装步骤_jdk下载安装步骤
  12. 枯燥的Kotlin协程三部曲(上)——概念启蒙篇
  13. 什么是无监督、监督、半监督学习
  14. 功能软件(一):以IDM对抗百度网盘!
  15. 大数据:2019年汽车4S店访客画像
  16. 静态时序分析(STA)基本概念
  17. tp框架配置路由的初学习
  18. mac 下安装编译 yasm
  19. 宣传片拍摄方案如何撰写?
  20. JavaScript 不多但够用(大概)

热门文章

  1. CI 什么是构建 gradle
  2. PHP二维数组按照指定的字段排序的函数
  3. vue—点击换一批就更换一批内容_Vue.js点击切换按钮改变内容的实例讲解
  4. 基于Java的网上超市系统
  5. mysql导入报错 [Err] 1273 – Unknown collation: ‘utf8mb4_0900_ai_ci’
  6. 计算机启动过程过程图,计算机启动过程图文详解(一)----计算机初始化启动过程...
  7. css之input时间控件精确到时分秒
  8. jQuery基础(jQuery概念,jQuery与js入口函数的区别及其入口函数的其他写法和冲突问题)
  9. 操作系统——基本概念·
  10. 一个创建 docker java jar项目案例 docker-sentinel