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

我正在使用ASP.NET Core,并尝试本地化应用程序。 我设法使用新的 asp .net核心资源来本地化控制器和视图,并使用资源来本地化错误消息以进行模型validation。 但是,当错误消息未链接到模型字段注释(如“必需”)并且模型绑定的数据不正确时(如预期数字的文本),我收到如下错误,我是无法本地化:

“值’abc’对ID无效。”

当我在ViewID属性输入abc ,由于无法对该字段进行模型绑定,并且它在该字段附近显示validation消息,因此说“值’abc’对于ID无效。” 。 这是我正在使用的课程:

 public class Country : IHasID { public int ID { get; set; } [Required(ErrorMessageResourceType = typeof(L.Val), ErrorMessageResourceName = "NameR")] [MaxLength(100, ErrorMessageResourceType = typeof(L.Val), ErrorMessageResourceName = "Max")] public string Name { get; set; } /*Some other properties*/ } 

我在互联网上发现的类似问题是针对较旧的asp .net版本,否则无法帮助我解决问题。

要自定义框架模型绑定错误消息,您需要为ModelBindingMessageProvider不同错误消息访问器设置自定义访问器。

在这里,您可以下载本文所述内容的完整源代码。 该存储库包含ASP.NET Core 2.0(VS 2017.3)ASP.NET Core 1.1(VS 2015)的示例:

  • R-aghaei / AspNetCoreLocalizationSample

在这里你可以看到实例:live:

  • aspnetcorelocalizationsample.azurewebsites.net

默认错误消息

这些是框架在绑定到属性的模型失败时显示的默认错误消息:

 MissingBindRequiredValueAccessor A value for the '{0}' property was not provided. MissingKeyOrValueAccessor A value is required. ValueMustNotBeNullAccessor The value '{0}' is invalid. AttemptedValueIsInvalidAccessor The value '{0}' is not valid for {1}. UnknownValueIsInvalidAccessor The supplied value is invalid for {0}. ValueIsInvalidAccessor The value '{0}' is invalid. ValueMustBeANumberAccessor The field {0} must be a number. 

除上述消息外,ASP.NET Core 2.0还包含以下消息:

 MissingRequestBodyRequiredValueAccessor A non-empty request body is required. NonPropertyAttemptedValueIsInvalidAccessor The value '{0}' is not valid. NonPropertyUnknownValueIsInvalidAccessor The supplied value is invalid. NonPropertyValueMustBeANumberAccessor The field must be a number. 

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

若要本地化ASP.NET Core模型绑定错误消息,请按照下列步骤操作:

  1. 创建资源文件 – 在解决方案的Resources文件夹下创建资源文件,并将文件命名为ModelBindingMessages.fa.resx 。 名称可以是其他任何名称,但我们将使用它来创建本地化程序。 在这个例子中,我使用了fa (波斯语)文化。

  2. 添加资源键 – 打开资源文件并添加要用于本地化错误消息的键和值。 我使用了键和值,如下图所示:

    在此处输入图像描述

    我使用的键就像原始消息,除了ValueMustNotBeNull的键与ValueMustNotBeNull相同,所以我使用Null值无效。 为了它。

  3. 配置选项 – 在ConfigureServices方法中,添加Mvc ,配置其选项以设置ModelBindingMessageProvider消息访问ModelBindingMessageProvider

     public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => { options.ResourcesPath = "Resources"; }); services.AddMvc(options => { var F = services.BuildServiceProvider().GetService(); var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample"); options.ModelBindingMessageProvider.ValueIsInvalidAccessor = (x) => L["The value '{0}' is invalid."]; options.ModelBindingMessageProvider.ValueMustBeANumberAccessor = (x) => L["The field {0} must be a number."]; options.ModelBindingMessageProvider.MissingBindRequiredValueAccessor = (x) => L["A value for the '{0}' property was not provided.", x]; options.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor = (x, y) => L["The value '{0}' is not valid for {1}.", x, y]; options.ModelBindingMessageProvider.MissingKeyOrValueAccessor = () => L["A value is required."]; options.ModelBindingMessageProvider.UnknownValueIsInvalidAccessor = (x) => L["The supplied value is invalid for {0}.", x]; options.ModelBindingMessageProvider.ValueMustNotBeNullAccessor = (x) => L["Null value is invalid.", x]; }) .AddDataAnnotationsLocalization() .AddViewLocalization(); services.Configure(options => { var supportedCultures = new[]{new CultureInfo("en"), new CultureInfo("fa")}; options.DefaultRequestCulture = new RequestCulture("en", "en"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); } 

    还要在Configure方法的开头添加此代码:

     var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("fa") }; app.UseRequestLocalization(new RequestLocalizationOptions() { DefaultRequestCulture = new RequestCulture(new CultureInfo("en")), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }); 

ASP.NET Core 2.0的重要说明

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

例如,要设置ValueIsInvalidAccessor ,您应该以这种方式使用SetValueIsInvalidAccessor()方法:

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