无废话MVC入门教程六[Model中的验证规则]
本文目标
一、能够使用Model的Attribute进行服务端数据验证
本文目录
一、概述
二、MVC提供的常用上下文
三、自定义正则表达式验证
一、概述
为了确保数据的安全性,由Client发送到服务端的每一项数据我们都会做严格的数据校验。MVC做数据校验一般都会写在Model的Attribute上,代码看起来更加优雅、简洁。在下面的介绍中我们对校验进行了归类,一种是MVC框架里提供的默认校验方式、另一种通过继承来实现自定义规则。
二、MVC提供的常用上下文
1.Model中的代码
1 using System.ComponentModel.DataAnnotations; 2 3 namespace MVC3.Demo.Models 4 { 5 public class ValidationModel 6 { 7 [Display(Name = "特殊数字")] 8 [Required(ErrorMessage = "请输入{0}")] 9 [StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之间", MinimumLength = 1)] 10 public string InputNumber { get; set; } 11 } 12 }
[Display(Name = "特殊数字")]:视图如显示的名称,具体看运行效果。
[Required(ErrorMessage = "请输入{0}")]:InputNumber是必须填写的,如果不填写ErrorMessage属性的值将以显示在页面上。{0}为Display中Name属性的占位符。
[StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之间", MinimumLength = 1)]:字符串长度为:1-20之间。{0}、{1}、{2}分别为参数的占位符。
2.View中的代码
1 @model MVC3.Demo.Models.ValidationModel 2 @{ 3 Layout = null; 4 } 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <title>ModelValidation</title> 9 </head> 10 <body> 11 <div> 12 @using (Html.BeginForm()) 13 { 14 <div> 15 @Html.LabelFor(model => model.InputNumber) 16 @Html.TextBoxFor(model => model.InputNumber) 17 @Html.ValidationMessageFor(model => model.InputNumber) 18 </div> 19 <div> 20 <input type="submit" value="提交" /> 21 </div> 22 } 23 </div> 24 </body> 25 </html>
@Html.LabelFor(model => model.InputNumber):显示Model中的DisplayAttribute的Name属性
@Html.ValidationMessageFor(model => model.InputNumber):显示错误信息的HtmlHelper
3.Control中的代码
1 public ActionResult ModelValidation() 2 { 3 return View(); 4 } 5 6 [HttpPost] 7 public ActionResult Validation(Models.ValidationModel model) 8 { 9 if (ModelState.IsValid) 10 { 11 var inputNumber = model.InputNumber; 12 } 13 return View(); 14 }
ModelState.IsValid:校验客户端数据是否全部符合验证规则
4.运行效果
5.其他验证
详细请查阅MSDN:http://msdn.microsoft.com/zh-cn/library/cc490428(v=vs.95).aspx
三、自定义正则表达式验证
1.常规方式
1 using System.ComponentModel.DataAnnotations; 2 3 public class ValidationModel 4 { 5 [RegularExpression(@"^[0-5]*$", ErrorMessage = "只能输入0-5间的数字")] 6 public string InputNumber { get; set; } 7 }
[RegularExpression(@"^[0-5]*$", ErrorMessage = "只能输入0-5间的数字")]:第一个参数为要验证的正责表达式,第二个参数为错误消息。
如果有多个Model中的属性都要使用这个正责表达式,那么“常规方式”显得代码大量的冗余
2.继承方式
用一个类去继承RegularExpressionAttribute,从而达到封装正责表达式和错误消息作用,类代码如下:
1 using System; 2 using System.ComponentModel.DataAnnotations; 3 4 namespace MVC3.Demo.App_Code 5 { 6 public class SpecialValidation : RegularExpressionAttribute 7 { 8 public SpecialValidation() : base(@"^[0-5]*$") { } 9 10 public override string FormatErrorMessage(string name) 11 { 12 return String.Format("{0}在0-5之间", name); 13 } 14 } 15 }
使用代码如下:
1 using System.ComponentModel.DataAnnotations; 2 using MVC3.Demo.App_Code; 3 4 namespace MVC3.Demo.Models 5 { 6 public class ValidationModel 7 { 8 [SpecialValidation] 9 public string InputNumber { get; set; } 10 } 11 }
上面的代码效果等同于:[RegularExpression(@"^[0-5]*$", ErrorMessage = "{0}只能输入0-5间的数字")]
3.运行效果