自定义IModelBinder:如何仅返回自定义错误信息
解决自定义模型绑定器返回重复错误的问题
问题核心是[ApiController]会自动对不可空的复杂类型参数进行必填校验,当自定义绑定器返回绑定失败时,框架会额外添加一条complexObject必填的错误。要解决这个问题,有两种简洁的方案:
方案一:修改模型绑定器的绑定行为(推荐)
在参数的[ModelBinder]特性中指定BindingBehavior.Optional,告诉框架该参数的必填性由自定义绑定器处理,无需自动添加校验错误:
public ActionResult<string> Test( [FromQuery] [ModelBinder(BinderType = typeof(ComplexObjectModelBinder), BindingBehavior = BindingBehavior.Optional)] TComplexObject complexObject) { return "Called!"; }
这样框架不会再自动生成complexObject的必填错误,只会保留你在绑定器中添加的parameter1错误。
方案二:手动移除框架生成的错误
如果不想修改绑定行为,也可以在绑定器中绑定失败时,手动移除ModelState中关于complexObject的错误:
public class ComplexObjectModelBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { IQueryCollection query = bindingContext.HttpContext.Request.Query; if (!query.ContainsKey("parameter1")) { bindingContext.ModelState.AddModelError("parameter1", $"The `{'parameter1'}` parameter is required."); // 移除框架自动添加的complexObject参数错误 bindingContext.ModelState.Remove(bindingContext.ModelName); bindingContext.Result = ModelBindingResult.Failed(); return Task.CompletedTask; } TComplexObject complexObject = new(); bindingContext.Result = ModelBindingResult.Success(complexObject); return Task.CompletedTask; } }
两种方案都能实现只保留自定义错误的需求,方案一更符合ASP.NET Core的设计规范,推荐使用。
内容的提问来源于stack exchange,提问作者killswitch
相关产品推荐
相关产品推荐

