gpt4 book ai didi

asp.net-core-5.0 - 警告 CS0618 : 'ComplexTypeModelBinder' is obsolete

转载 作者:行者123 更新时间:2023-12-05 03:39:56 24 4
gpt4 key购买 nike

在 .NET Core 3 中,我扩展了 ComplexTypeModelBinder 类来为特定类创建自定义模型绑定(bind)器。

主要目标是通过 CreateModel 方法覆盖模型实例的创建。

public MyModelBinder: ComplexTypeModelBinder
{
// Constructor here...

protected override object CreateModel(ModelBindingContext bindingContext)
{
// Create model instance based on custom condition.
}

}

升级到 .NET 5 后,我收到一条编译警告,要求将 ComplexTypeModelBinder 替换为 ComplexObjectModelBinder:

warning CS0618: 'ComplexTypeModelBinder' is obsolete: 'This type is obsolete and will be removed in a future version. Use ComplexObjectModelBinder instead.'

问题在于 ComplexObjectModelBinder 是密封类,而 CreateModel 方法是内部,因此子类方法不再有效。

最佳答案

我选择的解决方案是创建类 MyModelBinder,它实现了 IModelBinder 接口(interface)并作为 ComplexObjectModelBinder 的包装器。 ComplexObjectModelBinder 作为构造函数参数传入 MyModelBinder

MyModelBinderProviderComplexObjectModelProvider 使用相同的方法。

稍后,不再覆盖 ComplexObjectModelBinderCreateMethod,这在 .NET 5 中是不可能的,只需在包装器中分配 bindingContext.Model MyModelBinder 的方法 BindAsyncModel,在将 bindingContext 传递给 ComplexObjectModelBinderBindAsyncModel 之前。这将使 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);
}
}

对于自定义模型绑定(bind)提供者的注册,首先我们找到现有的,自动注册的ComplexObjectBinderProvider,在MyModelBinderProvider的构造函数中使用它,然后插入MyModelBinderProviderComplexObjectBinderProvider 前面。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options => {
// more configurations here...

var bindingProvider = options.ModelBinderProviders.First(provider =>
provider is ComplexObjectModelBinderProvider) as ComplexObjectModelBinderProvider;

var indexOf = options.ModelBinderProviders.IndexOf(bindingProvider);

options.ModelBinderProviders.Insert(indexOf, new MyModelBinderProvider(bindingProvider));
}
}

关于asp.net-core-5.0 - 警告 CS0618 : 'ComplexTypeModelBinder' is obsolete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68347546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com