custom-model-binder - 如何在 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
,但还没有发现如何(或者我是否在正确的轨道上)。我是吗?ModelMetadata
bindingContext
解决方案
它实际上确实像第一个代码片段所示的那样工作。我的问题是显示的代码位于依赖于 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 包工作得很好。
推荐阅读
- javascript - 元素 UI $confirm 不是函数
- php - 如何修复 PHP 中的“simplexml_load_file”错误
- php - 如何修复:警告:第 140 行 F:\xampp\htdocs\digikalamvc\core\model.php 中的非法偏移类型或为空
- javascript - IE11(32 位)中 Uint8Array 的最大大小是多少?
- android - Flutter Barcode_scan 插件崩溃 App?
- symfony - 从 Symfony 1.4 升级到 Symfony 4
- c# - 使用 AD 身份验证从 Azure Web App 获取用户
- snappydata - SnappyData Server 启动失败:尝试连接分布式系统超时
- python - 神经网络中的多对象输入
- angular - 如何根据嵌套组件对材料表进行排序