随笔 - 67  文章 - 0  评论 - 1737  0

朋友炒股两个月赚了10万,我帮他推广一下公众号,把钱用来投资总比放银行连通货膨胀都跑不过里强硬核离职,在家炒股 ,这是他每天的日志,有些经验是花钱也买不到的。

本文目标

一、能够使用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.运行效果

版权:http://www.cnblogs.com/iamlilinfeng

posted on 2013-03-02 15:57  李林峰的园子  阅读(...)  评论(...编辑  收藏