首页 > 解决方案 > 如何在 ModelBinders 中使用 DefaultModelBindingMessageProvider

问题描述

我们有一个自定义的 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 中设置属性ModelBindingMessageProvider,但还没有发现如何(或者我是否在正确的轨道上)。我是吗?ModelMetadatabindingContext

标签: custom-model-binderasp.net-core-2.2

解决方案


它实际上确实像第一个代码片段所示的那样工作。我的问题是显示的代码位于依赖于 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 包工作得很好。


推荐阅读