MVC 3 数据验证 Model Validation 详解

然后我们就需要添加对应的Model ,其实在MVC中Model层对应的不一定是实体类,还可以是领域模型。这个区别还是存在的。我们添加一个简单的User类,
1 namespace MvcApplication4.Models
 2 {
 3     public class UserInfo
 4     {
 5         //ID编号
 6         [ScaffoldColumn(false)]
 7         [Required(AllowEmptyStrings = false, ErrorMessage = "用户ID不能为空")]
 8         [Display(Name = "记录编号", Order = 20000)]
 9         public int ID { get; set; }
10 
11         [Display(Order = 15000)]
12         [Required(AllowEmptyStrings = false, ErrorMessage = "用户名不能为空")]
13         [StringLen >h(20, MinimumLen >h = 6, ErrorMessage = "用户名不能大于{2} 且要小于{1}")]
14         [Remote("User", "Validate", HttpMethod = "post", ErrorMessage = "用户名已经存在")]
15         public string UserName { get; set; }
16 
17         
18         [Display(Name="password")]
19         [DataType(DataType.Password)]
20         [Required(AllowEmptyStrings = false, ErrorMessage = "密码不能为空")]
21         [StringLen >h(60, MinimumLen >h = 20, ErrorMessage = "密码必须在{2} 和{1}之间")]
22         public string UserPassword { get; set; }
23 
24         [Required(AllowEmptyStrings = false, ErrorMessage = "邮箱必填")]
25         [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9]+\.[A-Za-z]{2,4}", ErrorMessage = "{0}的格式不正确")]
26         public string Email { get; set; }
27 
28         [Compare("Email", ErrorMessage = "邮箱要相同")]
29         public string TEmail { get; set; }  //compare 大小写要相同 否则不会触发 验证
30 
31 
32         [Display(Name = "身份证号码")]
33         [RegularExpression(@"\d{17}[\d|x]|\d{15}", ErrorMessage = "身份证号码格式错误")]
34         public string IdentityNo { get; set; }
35 
36         [Required(AllowEmptyStrings = false, ErrorMessage = "年龄必填")]
37         [Range(10, 100, ErrorMessage = "年龄不能大于{2} 不能小于{1}")]
38         public int Age { get; set; }
39 
40         [ReadOnly(true)]
41         [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
42         [Required(ErrorMessage = "金额不能为空")]
43         [Range(typeof(decimal), "20.0", "30.0", ErrorMessage = "金额在{1}和{2}之间")]
44         public decimal Money { get; set; }
45     }
46 }

在Model 层UserInfo类中,我们定义了一个User应该具有的属性,以及需要为每个属性添加的不同验证。设置好了Model,我们就需要通过Controller来显示对应的View层。

其实Controller不需要做任何的处理,只需要选择一个合适的View进行页面显示。最重要的是在View层。

 @{
 2     Layout = null;
 3 }
 4 @model MvcApplication4.Models.UserInfo
 5 !DOCTYPE html
 6 html
 7 head
 8     titleIndex/title
 9 /head
10 body
11     script src="/upload/attach/blank.gif"  data-echo="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"/script
12     script src="/upload/attach/blank.gif"  data-echo="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"/script
13     script src="/upload/attach/blank.gif"  data-echo="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"/script
14     div
15         @using (Html.BeginForm())
16         { 
17             @Html.ValidationSummary(true)
18             fieldset
19                 legendUserInfo/legend
20                
21 
22                 
23                 div class="editor-label"
24                     @Html.LabelFor(t = t.UserPassword)
25                 /div
26                 div class="editor-field"
27                     @Html.EditorFor(model = model.UserPassword)
28                     @Html.ValidationMessageFor(model = model.UserPassword)
29                 /div
30                 div class="editor-label"
31                     @Html.LabelFor(t = t.IdentityNo)
32                 /div
33                 div class="editor-field"
34                     @Html.EditorFor(model = model.IdentityNo)
35                     @Html.ValidationMessageFor(model = model.IdentityNo)
36                 /div
37                 div class="editor-label"
38                     @Html.LabelFor(t = t.Email)
39                 /div
40                 div class="editor-field"
41                     @Html.EditorFor(model = model.Email)
42                     @Html.ValidationMessageFor(model = model.Email)
43                 /div
44 
45                 div class="editor-label"
46                     @Html.LabelFor(t = t.Age)
47                 /div
48                 div class="editor-field"
49                     @Html.EditorFor(model = model.Age)
50                     @Html.ValidationMessageFor(model = model.Age)
51                 /div
52                 
53                 div class="editor-label"
54                     @Html.LabelFor(t = t.Money)
55                 /div
56                 div class="editor-field"
57                     @Html.EditorFor(model = model.Money)
58                     @Html.ValidationMessageFor(model = model.Money)
59                 /div
60 
61                  div class="editor-label"
62                     @Html.LabelFor(t = t.TEmail)
63                 /div
64                 div class="editor-field"
65                     @Html.EditorFor(model = model.TEmail)
66                     @Html.ValidationMessageFor(model = model.TEmail)
67                 /div
68 
69                 @Html.EditorForModel()
70 
71             /fieldset
72             input type="submit" value="提交" /
73         }
74     /div
75 /body
76 /html

我在View层中定义了两种显示Model数据的方式,一种是通过html.EditorFor(model)来分别显示每个不同的属性,另外一个简洁的方式就是通过html.EditorForModel()进行,这个方法会提供错误信息显示等。

Model 、View、Controller都设置好了,下面我们来看一下最终运行的效果。

在效果图中,我们看到了两个相同的部分,这是我采用两个不同的显示方式显示的效果。其中有两个Age,这两个只要一个验证通过,就会验证通过。根本原因就是它们的ID值是相同的。

看到了实际效果,我们来逐个分析一下每个验证Attribute的实现方式 极其注意方式。

Required 必填项 表示的是这个字段值是必填的。

[Required(AllowEmptyStrings = false, ErrorMessage = "用户名不能为空")]


 1   public class MaxWordsAttribute : ValidationAttribute
 2     {
 3 
 4         public MaxWordsAttribute(int maxWords)
 5             : base("{0} 字符串过长")
 6         {
 7             _maxWords = maxWords;
 8         }
 9         private readonly int _maxWords;
10 
11         protected override ValidationResu<  IsValid(object value, ValidationContext validationContext)
12         {
13             if (value != null)
14             {
15                 var valueAsString = value.ToString();
16                 if (valueAsString.Split(‘ ‘).Len >h  _maxWords)
17                 {
18                     var errorMessage = FormatErrorMessage(
19                     validationContext.DisplayName);
20                     return new ValidationResu< (errorMessage);
21                 }
22             }
23             return ValidationResu< .Success;
24         }
25     }


MVC 验证特性提高了我们开发的效率以及稳定性,值得我们学习。还是那句话,每天学一学,自己常进步,世界更美好。

MVC 的验证扩展特性 以及全球化,我们在以后有机会在一起学习。

MVC 3 数据验证 Model Validation 详解

原文地址:http://www.cnblogs.com/sjqq/p/7260975.html


最新回复(0)
/jishu6Hbi9L3EXhQM5Tls2cLRkKMY4n5ozXMLDoyYSNXydlU_3D4719346
8 简首页