ASP.NET ASP.NET CORE 2.0 中的核心模型绑定错误消息本地化

ASP.NET Core Model Binding Error Messages Localization in ASP.NET CORE 2.0

在 ASP.NET CORE 1.1 中,可以使用资源文件本地化模型绑定错误消息,并配置其选项以在 Startup.cs 中为 ModelBindingMessageProvider 设置消息访问器,例如

services.AddMvc(options =>
{
    var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
    var L = F.Create("ModelBindingMessages", null);
    options.ModelBindingMessageProvider.ValueIsInvalidAccessor =
        (x) => L["The value '{0}' is invalid."];

如下所示: and here: https://blogs.msdn.microsoft.com/mvpawardprogram/2017/05/09/aspnetcore-mvc-error-message/

在 ASP.NET CORE 2.0 中,我收到有关 ModelBindingMessageProvider 的所有属性的错误消息

options.ModelBindingMessageProvider.ValueIsInvalidAccessor 

只读

如何在 ASP.NET CORE 2.0

中本地化这些消息

我也运行喜欢这个。这些设置器已替换为 SetValueIsInvalidAccessor 等方法,此处描述了更改:https://github.com/aspnet/Announcements/issues/240

在 ASP.NET Core 2.0 中,模型绑定消息提供程序属性变为只读,但为每个 属性 添加了一个 setter 方法。

因此,如果您按照我的 的示例设置 ValueIsInvalidAccessor,您应该这样使用 SetValueIsInvalidAccessor 方法:

options.ModelBindingMessageProvider.SetValueIsInvalidAccessor (
    (x) => L["The value '{0}' is invalid."]);

示例项目

我在以下存储库中添加了 ASP.NET CORE 2.0 的示例项目:

默认错误消息:

  • MissingBindRequiredValueAccessor: 未提供“{0}”的值 属性。
  • MissingKeyOrValueAccessor: 需要一个值。
  • MissingRequestBodyRequiredValueAccessor: 需要一个非空的请求体。
  • ValueMustNotBeNullAccessor: 值“{0}”无效。
  • AttemptedValueIsInvalidAccessor: 值“{0}”对 {1} 无效。
  • NonPropertyAttemptedValueIsInvalidAccessor: 值“{0}”无效。
  • UnknownValueIsInvalidAccessor: 提供的值对 {0} 无效。
  • NonPropertyUnknownValueIsInvalidAccessor: 提供的值无效。
  • ValueIsInvalidAccessor: 值“{0}”无效。
  • ValueMustBeANumberAccessor: 字段 {0} 必须是数字。
  • NonPropertyValueMustBeANumberAccessor: 字段必须是数字。

您可以使用此配置来本地化 mvc 核心错误消息:

public class SomeMvcOptionsSetup : Microsoft.Extensions.Options.IConfigureOptions<Microsoft.AspNetCore.Mvc.MvcOptions>
{
    private readonly Microsoft.Extensions.Localization.IStringLocalizer _resourceLocalizer;

    public SomeMvcOptionsSetup()
    {
    }

    public SomeMvcOptionsSetup(Microsoft.Extensions.Localization.IStringLocalizerFactory stringLocalizerFactory)
    {
        _resourceLocalizer = stringLocalizerFactory.Create(baseName:"ResourceClassName",location:"ResourceNameSpace");
    }

    public void Configure(Microsoft.AspNetCore.Mvc.MvcOptions options)
    {
        options.ModelBindingMessageProvider.SetValueIsInvalidAccessor((x) =>
        {
            if (_resourceLocalizer == null)
            {
                return "Custom Error Message";
            }

            return _resourceLocalizer["Specific Resource Key In Resource File"]; 
        });

        options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor((x) =>
        {
            if (_resourceLocalizer == null)
            {
                return "Value Can not be null....";
            }
            return _resourceLocalizer["ResourceKeyValueCanNotBeNull"];
        });

  .
  .
  .


    }
}

然后,将以下内容添加到您的 Startup.ConfigureServices(...) 方法中:

 services.TryAddEnumerable(
ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>,SomeMvcOptionsSetup >());

请看这个link