C# Web 数据注解Data Annotations、模型状态ModelState、数据验证

时间:2021-12-12 08:23:38

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

1. ModelState

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

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

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

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

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

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

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace FeiDu.Models.UserModels { /// <summary> /// 保存用户信息 /// </summary> public class SaveUserInfoInput { /// <summary> /// 名字 /// </summary> [Required(ErrorMessage = "请输入名字")] public string Name { get; set; } /// <summary> /// 手机号码 /// </summary> [Required(ErrorMessage = "请输入手机号码")] [RegularExpression(@"^1[1|2|3|4|5|6|7|8|9][0-9]\d{8}$", ErrorMessage = "手机号格式错误")] public string Phone { get; set; } /// <summary> ////// </summary> [Required(ErrorMessage = "请输入省")] public string Province { get; set; } /// <summary> ////// </summary> [Required(ErrorMessage = "请输入市")] public string City { get; set; } /// <summary> /// 地址 /// </summary> [Required(ErrorMessage = "请输入地址")] public string Address { get; set; } /// <summary> /// 手机验证码 /// </summary> [Required] public string PhoneCode { get; set; } } }

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

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

public ResponseMessageObj SaveUserInfo(SaveUserInfoInput input)

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

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

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http.Controllers; using System.Web.Http.Filters; namespace FeiDu.Common { /// <summary> /// 验证信息 /// </summary> public class GlobalActionFilterAttribute:ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); } } } }

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

//注册Global Filter 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")]