用途
该技能提供 ASP.NET Core 应用的综合验证模式,目标是解决验证分散、错误信息混乱、安全漏洞等问题。资料指出验证对安全性和用户体验都至关重要,并主张在多个层次上实施验证。
验证策略分层
资料给出一个分层表,说明不同层级的用途与对应技术:
- 客户端:即时反馈、降低服务器负载,使用 jQuery Validation、HTML5。
- 模型绑定:数据类型/格式验证,使用 Model Binders。
- 应用层:业务规则验证,使用 FluentValidation、DataAnnotations。
- 配置层:启动时验证,使用 IValidateOptions。
- 数据库层:约束强制执行,使用 EF Core Configurations。
验证方式决策树
根据复杂度选择验证方式:
- DataAnnotations(默认):声明式特性,如 [Required]、[Range]、[StringLength]、[RegularExpression],适合简单的属性级约束。
- IValidatableObject:实现 Validate() 处理跨属性规则,适合日期范围比较、条件必填字段。
- 自定义 ValidationAttribute:继承 ValidationAttribute,用于可复用的属性级规则。
- IValidateOptions<T>:在启动时验证配置/选项类,可访问 DI 服务。
- FluentValidation:第三方库,提供流式 API,适合复杂、可测试的验证,尤其是异步验证器和依赖数据库的规则。
主要模式
模式 1:DataAnnotations
使用 System.ComponentModel.DataAnnotations 命名空间,通过特性进行声明式验证。资料给出 CreateProductRequest 示例,包含 [Required]、[StringLength]、[Range]、[RegularExpression]、[EmailAddress]、[Url] 等。并附有特性参考表,列出 [Required]、[StringLength]、[Range]、[RegularExpression]、[EmailAddress]、[Phone]、[Url]、[CreditCard]、[Compare]、[MaxLength]/[MinLength],以及 .NET 8+ 的 [AllowedValues]、[DeniedValues]、[Length]、[Base64String]。
模式 2:自定义 ValidationAttribute
可创建可复用的领域规则特性。资料给出属性级示例 FutureDateAttribute,以及类级示例 DateRangeAttribute,用于比较开始与结束日期。
模式 3:IValidatableObject
在模型内实现跨属性验证。示例 CreateOrderRequest 中校验发货日期必须晚于下单日期、订单总额上限、以及含可发货商品时发货日期必填。资料说明:当验证逻辑仅针对单个模型时使用 IValidatableObject;当同一规则适用于多个模型时使用自定义 ValidationAttribute。
模式 4:IValidateOptions
在启动时验证配置/选项类,并可访问 DI 服务。示例 DatabaseOptionsValidator 校验连接字符串、重试次数范围、连接池大小关系。注册方式使用 AddOptions<DatabaseOptions>().BindConfiguration(...).ValidateDataAnnotations().ValidateOnStart(),并注册 IValidateOptions 单例。
模式 5:FluentValidation 设置
需要 NuGet 包 FluentValidation 与 FluentValidation.DependencyInjectionExtensions(资料标注版本 11.9.*)。配置包括 AddFluentValidationAutoValidation、AddFluentValidationClientsideAdapters、AddValidatorsFromAssemblyContaining<Program>。资料给出 SignUpValidator 示例,涵盖姓名、邮箱唯一性(异步)、密码复杂度、确认密码一致、接受服务条款等规则;还展示条件验证(When)与集合验证(RuleForEach + ChildRules)。
模式 6:MediatR 验证管道行为
通过 ValidationBehavior<TRequest, TResponse> 在 MediatR 管道中执行验证,收集失败并抛出 ValidationException,同时提供 ToDictionary() 便于返回错误字典。注册时使用 AddMediatR 并添加该行为。
模式 7:手动验证
提供 ValidationHelper,使用 Validator.TryValidateObject 以编程方式运行 DataAnnotations 验证。资料特别提醒:若不传 validateAllProperties: true,则只会检查 [Required] 特性。
模式 8:文件上传验证
FileUploadValidator 示例校验文件大小(不超过 10MB)与扩展名白名单(.jpg、.jpeg、.png、.pdf),并对描述字段做条件长度限制。
反模式
资料列出两类反模式:
- 重复验证:在多个位置重复编写相同验证逻辑,应集中到验证器中。
- 静默验证失败:捕获 ValidationException 后忽略结果,应始终将错误加入 ModelState。
适用场景与限制
该技能适用于 ASP.NET Core 后端项目,尤其是需要统一输入验证、配置启动校验、异步/数据库相关规则以及可测试验证逻辑的场景。资料未提供具体安装命令、收费信息、平台限制或性能数据;部分内容(如反模式示例末尾)在资料中不完整。