C#中的模型状态与数据注解,为我们提供了很便利的请求数据的验证。

1. ModelState

ModelState在进行数据验证的时候很有用的,它是:

1)验证数据,以及保存数据对应的错误信息。

2)微软的一种DRY(Don't Repeat Yourself)设计,通过ModelState可以做服务端验证,同时可以配合jquery validation生成前端数据验证

2. 数据注解Data Annotations、数据验证

如果我们想要添加数据验证,首先要创建我们的数据验证实体。

比如,我们有一个方法,是保存用户信息,而输入实体是SaveUserInfoInput

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.Web;
  6.  
  7. namespace FeiDu.Models.UserModels
  8. {
  9.  
  10. /// <summary>
  11. /// 保存用户信息
  12. /// </summary>
  13. public class SaveUserInfoInput
  14. {
  15.  
  16. /// <summary>
  17. /// 名字
  18. /// </summary>
  19. [Required(ErrorMessage = "请输入名字")]
  20. public string Name { get; set; }
  21.  
  22. /// <summary>
  23. /// 手机号码
  24. /// </summary>
  25. [Required(ErrorMessage = "请输入手机号码")]
  26. [RegularExpression(@"^1[1|2|3|4|5|6|7|8|9][0-9]\d{8}$", ErrorMessage = "手机号格式错误")]
  27. public string Phone { get; set; }
  28.  
  29. /// <summary>
  30. /// 省
  31. /// </summary>
  32. [Required(ErrorMessage = "请输入省")]
  33. public string Province { get; set; }
  34.  
  35. /// <summary>
  36. /// 市
  37. /// </summary>
  38. [Required(ErrorMessage = "请输入市")]
  39. public string City { get; set; }
  40.  
  41. /// <summary>
  42. /// 地址
  43. /// </summary>
  44. [Required(ErrorMessage = "请输入地址")]
  45. public string Address { get; set; }
  46.  
  47. /// <summary>
  48. /// 手机验证码
  49. /// </summary>
  50. [Required]
  51. public string PhoneCode { get; set; }
  52.  
  53. }
  54. }

从上面可以看到,我们添加了数据验证的注解,Required、RegularExpression

再看看我们的Controller中的保存用户信息的方法:

  1. public ResponseMessageObj SaveUserInfo(SaveUserInfoInput input)

当我们传数据的时候,发现输入验证类SaveUserInfoInput 并没有用,因为我们还没加入ModelState的验证。

3. 加入全局的ModelState的验证
首先我们建一个类GlobalActionFilterAttribute,继承ActionFilterAttribute,如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Web;
  7. using System.Web.Http.Controllers;
  8. using System.Web.Http.Filters;
  9.  
  10. namespace FeiDu.Common
  11. {
  12.  
  13. /// <summary>
  14. /// 验证信息
  15. /// </summary>
  16. public class GlobalActionFilterAttribute:ActionFilterAttribute
  17. {
  18.  
  19. public override void OnActionExecuting(HttpActionContext actionContext)
  20. {
  21. if (actionContext.ModelState.IsValid == false)
  22. {
  23. actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
  24. }
  25. }
  26.  
  27. }
  28. }

然后在WebApiConfig类的Register方法中,注册全局FilterAttribute

  1. //注册Global Filter
  2. config.Filters.Add(new GlobalActionFilterAttribute());

然后我们再运行,发现数据注解的验证可以了。

当然,我们也可以在固定的方法上面加入数据验证,而不需要注册全局的数据验证。

4. 数据注解demo

1)非空验证  [Required]

2)长度验证 [StringLength(100, MinimumLength = 10)]

3)正则表达式验证 [RegularExpression("your expression")]

4)值范围验证 [Range(10, 100)]

5)对比验证 [Compare("Name")]

C# Web 数据注解Data Annotations、模型状态ModelState、数据验证的更多相关文章

  1. [MVC4]Data Annotations Extensions:无法使用EmailAddress等验证特性的解决方法

    本文地址:http://www.cnblogs.com/egger/p/3404159.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 数据注解(Data Annotations) Web应用 ...

  2. 数据注解和验证 – ASP.NET MVC 4 系列

           不仅在客户端浏览器中需要执行验证逻辑,在服务器端也需要执行.客户端验证能即时给出一个错误反馈(阻止请求发送至服务器),是时下 Web 应用程序所期望的特性.服务器端验证,主要是因为来自网 ...

  3. ASP.NET MVC5(四):数据注解和验证

    前言 用户输入验证的工作,不仅要在客户端浏览器中执行,还要在服务端执行.主要原因是客户端验证会对输入数据给出即时反馈,提高用户体验:服务器端验证,主要是因为不能完全信任用户提供的数据.ASP.NET ...

  4. ASP.NET MVC5----常见的数据注解和验证

    只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...

  5. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First ...

  6. EF——默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 02 (转)

    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射   I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库 ...

  7. EF的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    I.EF的默认映射 上节我们创建项目,通过定义实体类就可以自动生成数据库,并且EF帮我们自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF的默认映射.具体分为: 数据库映射:Code Fi ...

  8. Entity Framework(三):使用特性(数据注解)创建表结构

    一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...

  9. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

随机推荐

  1. SQL Server 2008 表分区的含义

    https://www.cnblogs.com/knowledgesea/p/3696912.html 继续看这个文档 http://www.360doc.com/content/16/0104/11 ...

  2. xampp 80端口被占用后这么办??解决了

    modify port XAMPP: Another web server daemon is already running. 看不懂翻译一下 1. Open the file /opt/lampp ...

  3. 彻底卸载Oracle database 12c教程

    1.WIN+R,然后输入regedit,回车:2.在注册表中,进入目录:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,删除所有以oracl ...

  4. WPF的xaml中特殊字符表示

    直接看表,描述很清晰 字符 转义字符 备注 & (ampersand) & 这个没什么特别的,几乎所有的地方都需要使用转义字符 > (greater-than character ...

  5. Java并发编程总结5——ThreadPoolExecutor

    一.ThreadPoolExecutor介绍 在jdk1.8中,构造函数有4个.以 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ...

  6. yum 安装mysql数据库

    1.先查看是否有安装mysql,有的话通过yum remove mysql先卸载掉,卸载完成后执行 yum install -y mysql-server mysql mysql-deve 2.启动m ...

  7. [vuejs] vue2.0-layer-mobile移动端弹层

    vue2.0-layer-mobile移动端弹层 本次组件升级支持slot内容分发功能,实现高定制内容风格的弹层 安装方法 npm install vue2-layer-mobile -S 初始化 i ...

  8. [工具]Tomcat CVE-2017-12615 远程代码执行

    工具: K8_TocmatExp编译: VS2012  C# (.NET Framework v2.0)组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.b ...

  9. [Umbraco] document type里的父节点与子节点的设置

    虽然我们不能像做数据库设计那样建立主外键关系.但我们建立xml里父子关系,父子关系其实是指是否允许在一个页面(如频道,分类,栏目等)下创建子页面,这就相当于建立站点的树状结构,对于筛选数据会有很大的作 ...

  10. dotnetcore+vue+elementUI 前后端分离 三(前端篇)

    说明: 本项目使用了 mysql employees数据库,使用了vue + axois + element UI 2.0 ,演示了 单页程序 架构 ,vue router 的使用,axois 使用, ...