我正在使用 ASP.NET Core,并尝试本地化该应用程序。我设法使用new用于本地化控制器和视图的 asp .net core 资源,以及old用于本地化模型验证错误消息的资源。
但是,当错误消息未链接到模型字段注释(如“必需”)并且模型绑定的数据不正确(如需要数字的文本)时,我会收到如下错误,我是无法本地化:
“值‘abc’对于 ID 无效。”
当我进入abc
for ID
财产在View
,因为无法对字段进行模型绑定,并且它在字段附近显示一条验证消息,说“值‘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.
Example
您可以在这里下载本文中描述的完整源代码。该存储库包含示例ASP.NET Core 2.0(VS 2017.3) and ASP.NET Core 1.1(VS 2015):
- r-aghaei/AspNetCoreLocalizationSample
您还可以在这里看到示例:
- aspnetcore 本地化示例 www.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 Core 模型绑定错误消息
要本地化 ASP.NET Core 模型绑定错误消息,请按照下列步骤操作:
创建资源文件- 在下面创建一个资源文件资源解决方案中的文件夹并命名该文件模型绑定消息.fa.resx。该名称可以是其他任何名称,但我们将使用它来创建本地化器。在示例中,我使用了fa(波斯)文化。
-
添加资源键- 打开资源文件并添加要用于本地化错误消息的键和值。我使用了如下图所示的键和值:
我使用的密钥就像原始消息一样,除了密钥ValueMustNotBeNull
这与ValueIsInvalid
,所以我用了空值无效。 for it.
-
配置选项 - In ConfigureServices
方法,添加时Mvc
,配置其选项以设置消息访问器ModelBindingMessageProvider
:
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
services.AddMvc(options =>
{
var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample");
options.ModelBindingMessageProvider.ValueIsInvalidAccessor =
(x) => L["The value '{0}' is invalid.", x];
options.ModelBindingMessageProvider.ValueMustBeANumberAccessor =
(x) => L["The field {0} must be a number.", x];
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<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{new CultureInfo("en"), new CultureInfo("fa")};
options.DefaultRequestCulture = new RequestCulture("en", "en");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}
还要在开头添加此代码Configure
method:
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.", x]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)