我们有一个自定义的DateTimeModelBinder,它过去可以很好地与ASP.NET Core 1.1配合使用,但在升级到2.2后,它失败了。这是断裂部分:
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
bindingContext.ModelMetadata.ModelBindingMessageProvider.ValueMustNotBeNullAccessor(
valueProviderResult.ToString()));
错误为:
Method not found: 'Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata.get_ModelBindingMessageProvider()'.
失败的部分是:
bindingContext.ModelMetadata.ModelBindingMessageProvider
显然有些事情已经改变了。我发现这条消息解释了这一突破性的变化,但全部都是:
https://github.com/aspnet/Announcements/issues/240
显然,我们现在必须使用DefaultModelBindingMessageProvider
,但整个应用程序如何共享一个公共应用程序,包括模型绑定器?
问题是,在ModelBinders中,bindingContext.ModelMetadata.ModelBindingMessageProvider
过去指向包含字符串的类,但现在指向抽象类,因此由于出现上述错误而失败。
相反,使用它是有效的,但每次使用都要更新这个类似乎是错误的(而且,对翻译的更改不会反映出来(。
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
new DefaultModelBindingMessageProvider().ValueMustNotBeNullAccessor(
valueProviderResult.ToString()));
我觉得我应该能够在Startup.cs中的bindingContext
中设置ModelMetadata
的ModelBindingMessageProvider
属性,但还没有发现如何设置(或者我是否在正确的轨道上(。是吗?
它确实像第一个代码片段所显示的那样工作。我的问题是,显示的代码在一个依赖Microsoft.AspNetCore.Mvc 1.1.3版本的nuget包中。在我使用nuget包的项目中,我只是简单地将Microsoft.AspNetCore.Mvc重写到2.2.0版本,并认为这已经足够好了(两种实现的代码都相同(。
但我认为错误:代码是相同的,但ModelBindingMessageProvider被更改为抽象类/对象(从普通类/对象(,并使用1.1.3的编译nuget包,因此继续指向2.2.0 aspnetcore没有/不能更新的错误类型。将nuget包中的依赖项升级到2.2.0使nuget包正常工作。