如何为特定接口禁用DTO数据注解验证,另一接口保留验证?
特定接口禁用数据注解验证的实现方案
针对你的需求——仅在CreateBulkAsync接口禁用数据注解验证,CreateAsync接口保留默认验证,有两种可行的实现方式,根据你的.NET版本选择即可:
方法一:使用.NET 6+自带属性(推荐)
从.NET 6开始,ASP.NET Core提供了[DisableModelValidation]属性,直接标记在目标接口上就能禁用该接口的模型验证(包括数据注解验证):
// 给批量创建接口添加禁用验证属性 [DisableModelValidation] public virtual async Task<List<CreateOrUpdateBulkProductResultDto>> CreateBulkAsync(CreateBulkProductDto input) { // 你的业务逻辑 } // 单个创建接口不添加属性,保留默认验证 public virtual async Task<string> CreateAsync(CreateProductDto input) { // 你的业务逻辑 }
这个属性会直接跳过当前Action的自动模型验证流程,完全符合你的需求。
方法二:自定义过滤器(兼容.NET 5及更早版本)
如果你的项目基于.NET 5或更早版本,没有自带的禁用验证属性,可以自定义一个Action过滤器来实现:
- 先创建自定义过滤器类:
public class DisableModelValidationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { // 清除模型状态的验证标记,让系统认为验证已通过 context.ModelState.MarkAsValid(); base.OnActionExecuting(context); } }
- 然后把这个自定义属性标记在
CreateBulkAsync接口上:
[DisableModelValidation] public virtual async Task<List<CreateOrUpdateBulkProductResultDto>> CreateBulkAsync(CreateBulkProductDto input) { // 你的业务逻辑 }
这样就能达到和方法一同样的效果,仅禁用指定接口的数据注解验证。
内容的提问来源于stack exchange,提问作者CaglarAyhan
相关产品推荐
相关产品推荐

