泛型类型的自定义模型绑定

Posted

技术标签:

【中文标题】泛型类型的自定义模型绑定【英文标题】:Custom model binding for generic type 【发布时间】:2019-12-07 21:02:42 【问题描述】:

我有一个 ASP.Net MVC 4 应用程序,我正在尝试创建自定义模型绑定器。它必须处理的模型是这样的:

public class CompressedJsonViewModel<T>
    where T : ViewModel

将其作为 Action 中的参数接收为:

public ActionResult ImportData(CompressedJsonViewModel<ImportDataViewModel> input)

而且(目前)我有一个简单的活页夹,当配置好的时候我会改进它:

public class CompressedJsonModelBinder : DefaultModelBinder

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    
        return base.BindModel(controllerContext, bindingContext);
    

问题从这里开始。如果 CompressedJsonViewModel 未设置为通用,则以下分配给模型活页夹的工作:

binders.Add(typeof(CompressedJsonViewModel), new CompressedJsonModelBinder());

但是当我将泛型T 添加到类签名中时,不再调用BindModel 方法。我不知道如何设置正确的绑定。我尝试了两件事:

    绑定为

    binders.Add(typeof(CompressedJsonViewModel<>), new CompressedJsonModelBinder());
    

    创建一个接口为CompressedJsonViewModel : ICompressedJsonViewModel,并将其绑定设置为

    binders.Add(typeof(ICompressedJsonViewModel), new CompressedJsonModelBinder());
    

两者都不起作用。找到this,但对我来说似乎有些矫枉过正。我想避免在参数中使用[ModelBinder(typeof(CompressedJsonModelBinder))] 之类的东西,我想做一些比这更自动的东西。

【问题讨论】:

【参考方案1】:

使用自定义ModelBinderProvider

public class CompressedJsonBinderProvider : IModelBinderProvider

   public IModelBinder GetBinder(Type modelType)
   
       if(!modelType.IsGenericType)
            return null;

       var genericType =  modelType.GetGenericTypeDefinition();

       if(genericType == typeof(CompressedJsonViewModel<>))
           return new CompressedJsonModelBinder();

       return null;        
   

顺便说一下,这向您展示了机制,但我也会缓存 te=he 类型检查以避免必须对每个请求进行类型反射。

【讨论】:

以上是关于泛型类型的自定义模型绑定的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

泛型程序设计---泛型类的定义

泛型类的基本使用

JAVA——泛型类和泛型方法(静态方法泛型)

自定义泛型结构:泛型类泛型接口泛型方法

笔记:泛型