在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx
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 { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } 对比通俗的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"。 |
请发表评论