从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之六使用过滤器进行全局请求数据验证
在 上一篇 中讲到了在NetCore项目中如何进行全局异常处理,当手动抛出或系统未处理异常出现时进行的一个拦截处理。
本节中将讲到API请求模型的一个验证,先抛出几个问题,
- 为什么要使用模型验证?
对于我的了解来说,一般用户并不会都是输入的有效数据,这可能在应用程序中使用到这些数据时会产生一些意想不到的错误。 - 有什么作用?
使用模型验证是为了确保请求的数据在程序中能够有效使用,也是为了避免出现一些异常情况,还是就是可以不用在接口代码中再去关系模型数据的正确性,因为已经通过了模型验证。 - 如何使用?
MVC 对模型验证提供了较好的支持,提供了很多特性,可以通过 Model 元数据设置验证规则、用 ModelState 来处理错误信息、获取错误信息等。
在ASP.NET Core MVC 中提供了很多内置特性,一下是一些比较常用的内置特性:
以下是一些内置验证特性:
- [CreditCard] :验证属性是否有信用卡格式。
- [Compare] :验证模型中的两个属性是否匹配。
- [EmailAddress] :验证属性是否有电子邮件格式。
- [Phone] :验证属性是否有电话号码格式。貌似我们的号码无法使用这个,还是推荐使用正则特性
- [Range] :验证属性值是否在指定范围内。
- [RegularExpression] :验证属性值是否与指定的正则表达式匹配。
- [Required] :验证字段是否非 NULL。
- [StringLength] :验证字符串属性值是否未超过指定长度限制。
- [Url] :验证属性是否有 URL 格式。
- [Remote] :通过调用服务器上的操作方法,验证客户端上的输入。
除了这些内置特性之外,还可以添加自定义特性。为了方便示例,先创建一个 ClassicTestEqualAttribute 自定义属性,验证字段值是否等于内置值
/// <summary> /// 验证值是否等于内置值 /// </summary> public class ClassicTestEqualAttribute : ValidationAttribute { private string _bulitIn; private string _cusValid; public ClassicTestEqualAttribute(string bulitIn) { _bulitIn = bulitIn; } protected override ValidationResult IsValid( object value, ValidationContext validationContext) { var movie = (TestValidModel)validationContext.ObjectInstance; _cusValid = movie.CusValid; var cusValid = (string)value;//两种方式获取该字段值 - 也可以获取其它字段值 if (_bulitIn != cusValid) { return new ValidationResult(GetErrorMessage()); } return ValidationResult.Success; } public string CusValid => _cusValid; public string GetErrorMessage() { return $"测试模型中的{_bulitIn}不等于内置值"; } }
然后再创建一个测试model用来测试