一、能够使用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

Model中的验证规则的更多相关文章

  1. [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

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

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  3. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  4. Yii CModel中rules验证规则[转]

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  5. Yii CModel中rules验证规则

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  6. Yii2中rules验证规则

    required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...

  7. js正则基础总结和工作中常用验证规则

    知识是需要系统的.就像js正则用了那么多次,却还是浑浑噩噩,迫切需要来一次整理,那么来吧! 基本知识 元字符 \d 匹配数字等于[0-9] \w 匹配字母.数字.下划线.中文 \s 匹配任意空白字符 ...

  8. MVVM中数据验证之 ViewModel vs. Model

                                                      MMVM模式示意图. View绑定到ViewModel,然后执行一些命令在向它请求一个动作.而反过来 ...

  9. MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息

    Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...

随机推荐

  1. 51 nod 1522 上下序列——序列dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 很好的思想.考虑从小到大一对一对填数,这样也能对它的大小限制 ...

  2. JS---计算两个日期之间相差多少天

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. github怎么创建一个项目,怎么添加一个ssh-key的客户

    1.第一步:打开https://github.com/,登陆成功.单击猫图标,进入页面,单击[start a project] 第二步:输入项目名称,选择public公有,不收费的.单击确认成功. 第 ...

  4. WPF系列学习之三(路由事件)

    路由事件实际上以一上 列三种方式出现.    1.与普通的.net事件类似的直接路由事件.它们起源于一个元素,并且不传递给其他元素.例如:MouseEnter事件.    2.在包含层次中向上传递的冒 ...

  5. [poj3107/poj2378]Godfather/Tree Cutting树形dp

    题意:求树的重心(删除该点后子树最大的最小) 解题关键:想树的结构,删去某个点后只剩下它的子树和原树-此树所形成的数,然后第一次dp求每个子树的节点个数,第二次dp求解答案即可. 此题一开始一直T,后 ...

  6. CF-828C

    C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. 《Java多线程编程核心技术》读后感(三)

    synchronized同步语句块 用synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行以一个长时间的任务,那么B线程则必须等待比较较长的时间.在这样的情况下可以使用s ...

  8. EF外键保存数据

    using (DataContext dbcontext=new DataContext ()) { //emp.department.ID = dep.ID; //emp.department = ...

  9. Git 分支管理 多人协作 远程仓库 补充

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了, 并且,远程仓库的默认名称是origin. 如果是本地仓库关联远程仓库 --- 要查看远程库的信息,用 ...

  10. 在GitHub上上传项目(转载)

    今天准备在GitHub第一次上传自己的项目,发现过程并不是太简单,在网上找了一个博客,写的很详细,结合着他的讲解成功上传了自己的项目. 结合着他的步骤和自己遇到的问题,做一个梳理,以便以后使用.(原博 ...