C# ASP.NET Core 2.0中的ASP.NET Core模型绑定错误消息本地化
在ASP.NET CORE 1.1中,可以使用资源文件本地化模型绑定错误消息,并将其选项配置为在Startup.cs中为ModelBindingMessageProvider设置消息访问器,如C# ASP.NET Core 2.0中的ASP.NET Core模型绑定错误消息本地化,c#,.net,asp.net-core,localization,asp.net-core-localization,C#,.net,Asp.net Core,Localization,Asp.net Core Localization,在ASP.NET CORE 1.1中,可以使用资源文件本地化模型绑定错误消息,并将其选项配置为在Startup.cs中为ModelBindingMessageProvider设置消息访问器,如 services.AddMvc(options => { var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>(); var L = F.Create("ModelBindi
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."];
是只读的
如何在ASP.NET CORE 2.0中本地化这些消息我也遇到了这个问题。这些setter已被诸如
SetValueIsInvalidAccessor
之类的方法替换,此处描述了更改:在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:需要一个值
- MissingRequestBody RequiredValueAccessor:需要非空的请求正文
- ValueMustNotBeNullAccessor:值“{0}”无效李>
- AttemptedValueIsInvalidAccessor:值“{0}”对{1}无效
- NonPropertyAttentiedValueIsInvalidAccessor:值“{0}”无效
- UnknownValueIsInvalidAccessor:提供的值对于{0}无效
- 非属性YunKnownValueIsInvalidAccessor:提供的值无效
- ValueIsInvalidAccessor:值“{0}”无效
- ValueMustBeANumberAccessor:字段{0}必须是数字
- NonPropertyValueMustBeANumberAccessor:字段必须是数字
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"];
});
.
.
.
}
}
public类somemvcoptions设置:Microsoft.Extensions.Options.IConfigureOptions
{
私有只读Microsoft.Extensions.Localization.IStringLocalizer\u resourceLocalizer;
公共SomeMvcOptionsSetup()
{
}
公共SomeMvcOptionsSetup(Microsoft.Extensions.Localization.IStringLocalizerFactory stringLocalizerFactory)
{
_resourceLocalizer=stringLocalizerFactory.Create(baseName:“ResourceClassName”,location:“ResourceNameSpace”);
}
public void配置(Microsoft.AspNetCore.Mvc.mvcopions选项)
{
options.ModelBindingMessageProvider.SetValueIsInvalidAccessor((x)=>
{
如果(_resourceLocalizer==null)
{
返回“自定义错误消息”;
}
返回_resourceLocalizer[“资源文件中的特定资源密钥”];
});
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor((x)=>
{
如果(_resourceLocalizer==null)
{
返回“值不能为空…”;
}
返回_resourceLocalizer[“ResourceKeyValueCanNotBeNull”];
});
.
.
.
}
}
然后,将以下内容添加到Startup.ConfigureServices(…)方法中:
services.TryAddEnumerable(
servicescriptor.Transient());
请看此谢谢您的快速帮助!我在中添加了VS 2017 ASP.NET Core 2.0示例。“需要一个值”。翻译对我不起作用,其他所有人都可以。如果我将你的模型从int-Id改为string-Id,并在上面加上一个[Required],我总是收到英文错误,而不是翻译。这对你方有效吗?这不是默认模型绑定器错误消息的问题。这是因为
Required
属性。使用数据注释验证属性时,还需要对其进行本地化。要解决此问题,请执行与我对StringLength
属性所做的相同操作。在属性上方添加[必需(ErrorMessage=“{0}是必需的。”)]
。然后在Models.SampleModel.fa.resx中添加{0}是必需的。
具有值0}谢谢。我新增了这个选项,但是只使用了[Required]来谈论默认的错误消息,括号中没有任何错误消息。这一条似乎很难翻译。不客气:)这是数据注释的错误消息本地化工作的方式。我相信翻译{0}并不难。
;)
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"];
});
.
.
.
}
}
services.TryAddEnumerable(
ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>,SomeMvcOptionsSetup >());