Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 2.0中的ASP.NET Core模型绑定错误消息本地化_C#_.net_Asp.net Core_Localization_Asp.net Core Localization - Fatal编程技术网

C# ASP.NET Core 2.0中的ASP.NET Core模型绑定错误消息本地化

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

在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."];
是只读的


如何在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:字段必须是数字

您可以使用此配置来本地化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"];
        });

  .
  .
  .


    }
}
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 >());