Model 验证总结

Model 验证总结 1

一.Model 验证标记 1

1、启用客户端验证: 1

2、在 Model 中加入验证标记 2

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

3.1、必填字段 3

3.2 、 字段长度 3

3.3 、 正则验证 3

3.4、范围 4

3.5、服务端参与的验证 4

3.6、比较 4

3.7、自定义错误消息 5

4、后台 Action 的写法 6

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

二、 Model 验证标记实例: 9

1 、  实例一: 9

2 、实例二: 10

附录: 13

一.Model 验证标记

1、启用客户端验证:

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

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

<addkey="ClientValidationEnabled"value="true"/>

<addkey="UnobtrusiveJavaScriptEnabled"value="true"/>

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

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

<scriptsrc="@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)

2、在 Model 中加入验证标记

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

publicclassLogOnModel
{[Required][Display(Name ="User name")]publicstringUserName {get;set; }[Required][DataType(DataType.Password)][Display(Name ="Password")]publicstringPassword {get;set; }[Display(Name ="Remember me?")]publicboolRememberMe {get;set; }}

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

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

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

3.1、必填字段

[Required]

public string FirstName { get; set; }

3.2 、 字段长度

至多n位:

[StringLength(160)]

public string FirstName { get; set; }

要求至少n位:

[StringLength(160, MinimumLength=3)]

public string FirstName { get; set; }

3.3 、 正则验证

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

public string Email { get; set; }

3.4、范围

[Range(35,44)]

public int Age { get; set; }

小数的情况:

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

public decimal Price { get; set; }

3.5、服务端参与的验证

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

public string UserName { get; set; }

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

publicJsonResult CheckUserName(stringusername)
{var result = Membership.FindUsersByName(username).Count == 0;returnJson(result, JsonRequestBehavior.AllowGet);
}

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

public string Email { get; set; }

[Compare(“Email”)]

public string EmailConfirm { get; set; }

3.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; }

4、后台 Action 的写法

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

[HttpPost]publicActionResult LogOn(LogOnModel model,stringreturnUrl)
{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("/\\")){returnRedirect(returnUrl);}else{returnRedirectToAction("Index","Home");}}else{ModelState.AddModelError("","The user name or password provided is incorrect.");}}// If we got this far, something failed, redisplay formreturnView(model);
}

if (ModelState.IsValid) 是重点,如果不出意外,即客户端浏览器没有关闭JavaScript,并且客户不是个黑客(黑客可能会通过一些工具模拟POST),那只要通过正常途径 POST到这个Action的Model都应该是IsValid的。当然,编程的一个重要原则是不能相信用户的输入,所以我们有必要再判断一次 ModelState.IsValid。[HttpPost]表示这个Action只能通过POST动作调用,这是为了配合View里的表单,因为FORM的ACTION是POST(当然也可以是GET),不过这不在本文的讨论范围内。

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

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

数字:"^[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"。

二、Model 验证标记实例:

1、实例一:

public partial class UserDto     {public long ID { get; set; }[Display(Name="角色编号")]        public long RoleID { get; set; }[Display(Name="角色")]public string RoleName { get; set; }[StringLength(30)][Required(ErrorMessage="登录名不能为空")][Display(Name = "登录名")][System.Web.Mvc.Remote("CheckUserName", "User","Admin", ErrorMessage = "用户名已存在,请重新填写")]public string LoginID { get; set; }[Display(Name = "电话号码")][RegularExpression(RegexHelper.Phone,ErrorMessage = "电话格式有误,示例:023-12345678;(023)1234567-1234")]       public string Mobile { get; set; }[RegularExpression(RegexHelper.Email, ErrorMessage = "请输入正确的Email格式:abc@123.com")][Display(Name = "邮箱")][StringLength(30)]public string Email { get; set; }[Display(Name = "密码")][Required(ErrorMessage="请输入密码")]  [DataType(DataType.Password)][StringLength(16,MinimumLength=6)]public string Password { get; set; }[DataType(DataType.Password)][Display(Name = "确认密码")][System.ComponentModel.DataAnnotations.Compare("Password")]public string PasaswordConfirm { get; set; }[StringLength(80)]     public string PasswordHash { get; set; }[StringLength(10)][Display(Name = "密码盐")]public string PasswordSalt { get; set; }[StringLength(80)][Display(Name = "用户名")]public string UserName { get; set; }[StringLength(2)][Display(Name = "性别")]public string Gender { get; set; }[Display(Name = "出生日期")][DataType(DataType.Date)]public DateTime? Birthday { get; set; }[Display(Name = "操作")]public string Operation { get; set; }}}

2 、实例二:

namespace MvcApplication4.Models{public class UserInfo{        //ID编号[ScaffoldColumn(false)][Required(AllowEmptyStrings = false, ErrorMessage = "用户ID不能为空")][Display(Name = "记录编号", Order = 20000)]public int ID { get; set; }[Display(Order = 15000)][Required(AllowEmptyStrings = false, ErrorMessage = "用户名不能为空")][StringLength(20, MinimumLength = 6, ErrorMessage = "用户名不能大于{2} 且要小于{1}")][Remote("User", "Validate", HttpMethod = "post", ErrorMessage = "用户名已经存在")]public string UserName { get; set; }        [Display(Name="password")][DataType(DataType.Password)][Required(AllowEmptyStrings = false, ErrorMessage = "密码不能为空")][StringLength(60, MinimumLength = 20, ErrorMessage = "密码必须在{2} 和{1}之间")]public string UserPassword { get; set; }[Required(AllowEmptyStrings = false, ErrorMessage = "邮箱必填")][RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9]+\.[A-Za-z]{2,4}", ErrorMessage = "{0}的格式不正确")]public string Email { get; set; }[Compare("Email", ErrorMessage = "邮箱要相同")]public string TEmail { get; set; }  //compare 大小写要相同 否则不会触发 验证[Display(Name = "身份证号码")][RegularExpression(@"\d{17}[\d|x]|\d{15}", ErrorMessage = "身份证号码格式错误")]public string IdentityNo { get; set; }[Required(AllowEmptyStrings = false, ErrorMessage = "年龄必填")][Range(10, 100, ErrorMessage = "年龄不能大于{2} 不能小于{1}")]public int Age { get; set; }[ReadOnly(true)][DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")][Required(ErrorMessage = "金额不能为空")][Range(typeof(decimal), "20.0", "30.0", ErrorMessage = "金额在{1}和{2}之间")]public decimal Money { get; set; }}}

转载于:https://www.cnblogs.com/turnip/p/10592820.html

Mvc model验证总结相关推荐

  1. MVC Model验证总结 @Html.ValidationSummary(true)

    原文:https://blog.csdn.net/wybshyy/article/details/52064253 ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System. ...

  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. MVC Model验证

    [Required(ErrorMessage = "证件号不能为空!")][RegularExpression(@"(^\d{18}$)|(^\d{15}$)|(^\d{ ...

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

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

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

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

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

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

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

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

  8. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  9. Model验证系统运行机制是如何实现的?

    在前面三篇文章(<ModelValidator>.<ModelValidatorProvider>和<ModelValidatorProviders>)中我们详细介 ...

  10. ASP.NET MVC数据验证(上)

    关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解.也可能很多人都在Scott Guthrie等人写的一本<ASP.NET MVC 1.0>书中,见过Ner ...

最新文章

  1. 设计模式之迭代器模式(Iterator)摘录
  2. Eclipse使用的小细节归档
  3. TRichEdit_控制TRichEdit组件滚动
  4. 计算机加入域 不能访问网络位置 解决办法
  5. 博主应邀参加YOCSEF虚拟化技术论坛
  6. 爬取异步请求(XHR/JS)数据方法
  7. mysql schema 保存数据_如何在mysql数据库中保存apache spark schema输出
  8. PAT1104 Sum of Number Segments精度问题
  9. Rplidar A1利用Qt图形库进行周围环境的轮廓抓取
  10. 51Nod1203 2012集训队答辩 JZPLCM
  11. HIVE基础知识及优化(面试必备)
  12. python爬虫遇见needs to review the security of your connection before proceeding绕过 Cloudflare
  13. HM编码器代码阅读(15)——帧间预测之AMVP模式(三)xGetBlkBits函数
  14. 【结构体】结构变量的定义与初始化
  15. vim复制、粘贴以及配置总结
  16. WPE教学之-截取操作篇
  17. 如何安装java-jdk
  18. 一行代码用表情包制作炫酷二维码,详细教程奉上,包学会
  19. 软件实训-用例图2.0 + 简单用例描述
  20. 简单的小青蛙跳一跳问题

热门文章

  1. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;...
  2. CheckedListBoxControl 实现复选框的单选与多选功能
  3. [SAP ABAP开发技术总结]选择屏幕——各种屏幕元素演示
  4. 【原】GitHub使用教程
  5. OpenGL学习笔记(13)位图与文字
  6. 【KDD20】TAdaNet: 用于图增强元学习的任务自适应网络
  7. Python 100 例
  8. 【斯坦福大学新研究】声波、光波等都是RNN
  9. 资料 |《深度学习500问》,川大优秀毕业生的诚意之作
  10. 机器学习—LightGBM的原理、优化以及优缺点