您现在的位置:主页 > 香港六合神童博彩网 >

Core 60 基于模型验证的数据验证

来源:本站原创 发布时间:2022-08-23 点击数:

  在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的。前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验;后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性。

  本文描述的数据验证方案,是基于官方的[模型验证Model validation:,自定义其返回格式的方案。

  是笔者近期面试过程中才得知的方式【之前个人混淆了:模型验证(Model validation)和 EF 模型配置的数据注释(Data annotation)方式】。

  注:MVC 和 API 的模型验证有些许差异,本文主要描述的是 API 下的模型验证。

  官方提供了模型验证(Model validation)的方式,下面将会基于这种方式,提出相应的解决方案。

  先大概介绍一下模型验证(Model validation)的使用,随后提出两种自定义方案。

  官方提供的模型验证(Model validation)的方式,是通过在模型属性上添加验证特性(Validation attributes),配置验证规则以及相应的错误信息(ErrorMessage)。

  其中,除了内置的验证特性,用户也可以自定义验证特性(本文不展开),具体请自行查看自定义特性:一节。

  在 API 中,只要控制器拥有 ApiController:特性,如果模型验证不通过,将自动返回包含错误信息的 HTTP400 相应,详细请参阅自动 HTTP 400 响应:。

  如下代码中,[Required]表示该属性为必须,ErrorMessage =为该验证特性验证不通过时,返回的验证信息。香港刘伯温高手论坛

  [RegularExpression]:验证属性值是否与指定的正则表达式匹配。

  由于官方模型验证返回的格式与我们程序实际需要的格式有差异,所以这一部分主要是替换模型验证的返回结果,使用的实际上还是模型验证的能力。

  两种方案实际上都是差不多的(实际上都是基于过滤器 Filter 的),可以根据个人需要选择。

  所以,本文第3部门提及的两种自定义返回结果的方案,要么是自定义一个新的过滤器并禁用默认的过滤器,要么是替换生成模型验证结果的工厂。

  其中AddMvcCoreServices(services)方法会执行如下方法,由于这个方法太长,这里将与模型验证相关的一句代码摘出来:

  默认过滤器的 Order 为 -2000,其触发时机一般是较早的(模型验证也是要尽可能早)。

  过滤器管道的执行顺序:Order 值越小,越先执行 Executing 方法,越后执行 Executed 方法(即先进后出)。

  这一部分个人没有细看,套路大概是这样的:通过过滤器提供者(DefaultFilterProvider),获取实现IFilterFactory接口的实例,调用CreateInstance方法生成过滤器,并将过滤器添加到过滤器容器中(IFilterContainer)。