我们有一个自定义的DateTimeModelBinder,它过去在ASP.NET Core1.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属性,但是还没有发现如何设置(或者我是否在正确的轨道上)。我是吗?
发布于 2018-12-19 18:27:29
正如第一个代码片段所示,它确实可以工作。我的问题是,显示的代码位于依赖于Microsoft.AspNetCore.Mvc版本1.1.3的nuget包中。在我使用nuget包的项目中,我只是简单地将Microsoft.AspNetCore.Mvc覆盖到2.2.0版,并假设这已经足够好了(两种实现的代码都是相同的)。
但我的假设是错误的:代码是相同的,但ModelBindingMessageProvider被更改为抽象类/对象(来自普通类/对象),并使用1.1.3的编译nuget包,因此继续指向不能/不能由2.2.0aspnetcore更新的错误类型。将nuget包中的依赖项升级到2.2.0可以使nuget包正常工作。
https://stackoverflow.com/questions/53837244
复制相似问题