在 .NET Core 3 中,我扩展了 ComplexTypeModelBinder
类来为特定类创建自定义模型绑定器。
主要目标是通过 CreateModel
方法覆盖模型实例的创建。
public MyModelBinder: ComplexTypeModelBinder
{
// Constructor here...
protected override object CreateModel(ModelBindingContext bindingContext)
{
// Create model instance based on custom condition.
}
}
升级到 .NET 5 后,我收到编译警告,要求将 ComplexTypeModelBinder
替换为 ComplexObjectModelBinder
:
警告 CS0618:'ComplexTypeModelBinder' 已过时:'此类型已过时,将在未来版本中删除。改用 ComplexObjectModelBinder。'
问题是ComplexObjectModelBinder
是密封类,CreateModel
方法是internal
,所以子类方法不能再工作了。
答案 0 :(得分:0)
我确定的解决方案是创建类 MyModelBinder
,它实现 IModelBinder
接口并充当 ComplexObjectModelBinder
的包装器。 ComplexObjectModelBinder
作为构造函数参数传入 MyModelBinder
。
对 MyModelBinderProvider
和 ComplexObjectModelProvider
使用相同的方法。
稍后,不是覆盖 CreateMethod
的 ComplexObjectModelBinder
,这在 .NET 5 中是不可能的,只需在 {{1} 的包装器方法 bindingContext.Model
中分配 BindAsyncModel
},在将 MyModelBinder
传递给 bindingContext
的 ComplexObjectModelBinder
之前。这将使 BindAsyncModel
使用传入的模型,而不是创建默认的新实例。
ComplexObjectModelBinder
对于自定义模型绑定器提供者的注册,首先我们找到现有的,自动注册的public class MyModelBinder: IModelBinder
{
private readonly ComplexObjectModelBinder _binder;
public MyModelBinder(ComplexObjectModelBinder binder)
{
_binder = binder;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
MyModel myModel = // custom instantiation logic here
bindingContext.Model = myModel;
return _binder.BindModelAsync(bindingContext);
}
}
,在ComplexObjectBinderProvider
的costructor中使用,然后在{{1}前插入MyModelBinderProvider
}}。
MyModelBinderProvider