警告 CS0618:“ComplexTypeModelBinder”已过时

时间:2021-07-12 12:41:15

标签: asp.net-core-5.0

在 .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,所以子类方法不能再工作了。

1 个答案:

答案 0 :(得分:0)

我确定的解决方案是创建类 MyModelBinder,它实现 IModelBinder 接口并充当 ComplexObjectModelBinder 的包装器。 ComplexObjectModelBinder 作为构造函数参数传入 MyModelBinder

MyModelBinderProviderComplexObjectModelProvider 使用相同的方法。

稍后,不是覆盖 CreateMethodComplexObjectModelBinder,这在 .NET 5 中是不可能的,只需在 {{1} 的包装器方法 bindingContext.Model 中分配 BindAsyncModel },在将 MyModelBinder 传递给 bindingContextComplexObjectModelBinder 之前。这将使 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
相关问题