Asp.Net Core自定义ModelBinder:如何通过默认绑定器获取模型
自定义Model Binder中复用默认复杂模型绑定的实现方案
你需要在自定义Model Binder里先通过默认的复杂模型绑定逻辑获取模型,再进行自定义处理,具体实现可以借助ASP.NET Core提供的IModelBinderFactory和IModelMetadataProvider来复用默认绑定逻辑,步骤如下:
1. 注入必要服务
在自定义Model Binder的构造函数中注入IModelBinderFactory和IModelMetadataProvider,用于创建默认模型绑定器和获取模型元数据:
private readonly IModelBinderFactory _modelBinderFactory; private readonly IModelMetadataProvider _modelMetadataProvider; public CustomWrapperModelBinder(IModelBinderFactory modelBinderFactory, IModelMetadataProvider modelMetadataProvider) { _modelBinderFactory = modelBinderFactory; _modelMetadataProvider = modelMetadataProvider; }
2. 在BindModelAsync中复用默认绑定逻辑
修改你的BindModelAsync方法,构建默认绑定所需的上下文,调用默认绑定器完成模型绑定后再执行自定义操作:
public async Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(Wrapper<SomeType>)) { return; } // 获取目标类型的元数据(这里以Wrapper内部的SomeType为例,若需绑定Wrapper本身则替换为typeof(Wrapper<SomeType>)) var targetModelMetadata = _modelMetadataProvider.GetMetadataForType(typeof(SomeType)); // 创建默认的模型绑定器 var defaultBinder = _modelBinderFactory.CreateBinder(new ModelBinderFactoryContext { Metadata = targetModelMetadata, BindingInfo = bindingContext.BindingInfo }); // 构建默认绑定上下文,复用原请求的上下文信息、值提供器等 var defaultBindingContext = DefaultModelBindingContext.CreateBindingContext( bindingContext.ActionContext, bindingContext.ValueProvider, targetModelMetadata, bindingInfo: null, modelName: bindingContext.ModelName); // 执行默认模型绑定 await defaultBinder.BindModelAsync(defaultBindingContext); if (defaultBindingContext.Result.IsModelSet) { // 获取默认绑定生成的模型,包装为Wrapper类型 var model = new Wrapper<SomeType> { InnerModel = defaultBindingContext.Result.Model as SomeType }; // 在这里对model进行自定义操作 // manipulate 'model' // 返回绑定成功的结果 bindingContext.Result = ModelBindingResult.Success(model); } else { // 默认绑定失败时返回失败结果 bindingContext.Result = ModelBindingResult.Failed(); } }
关键说明
- 通过
DefaultModelBindingContext.CreateBindingContext复用原请求的上下文信息,确保默认绑定逻辑和原生行为完全一致 - 检查
defaultBindingContext.Result.IsModelSet判断默认绑定是否成功,避免处理无效模型 - 若
Wrapper<SomeType>本身是需要默认绑定的复杂模型,只需将targetModelMetadata的类型替换为typeof(Wrapper<SomeType>)即可
内容的提问来源于stack exchange,提问作者BrilBroeder
相关产品推荐
相关产品推荐

