隐式地法语化“ Required”注解

问题描述 投票:4回答:1

TLDR;如何获得

的行为
[Required(ErrorMessage = "Le champ {0} est obligatoire")]

仅写时

[Required]

据我所知,documentation没有提供一种隐式本地化给定的DataAnnotations集的方法。

[我想使诸如RequiredStringLength之类的注释的错误消息是可以重写的,而无需触及诸如Display之类的其他消息,而无需使用ErrorMessage属性来明确指定翻译。 >

注意:我只需要将消息翻译成法语,因此无需将解决方案绑定到请求的语言。

我尝试了以下操作:

来自this GitHub线程

Startup.cs

services.AddMvc(options => options.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor =
    (value, name) => $"Hmm, '{value}' is not a valid value for '{name}'."));

给我以下错误

无法将属性或索引器'DefaultModelBindingMessageProvider.AttemptedValueIsInvalidAccessor'分配给它-这是只读的

而且我找不到任何可以用作此对象的设置器的属性。


来自this这样的答案

Startup.cs中services.AddSingleton();

并创建一个如下的类

public class LocalizedValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
    private readonly ValidationAttributeAdapterProvider _originalProvider = new ValidationAttributeAdapterProvider();

    public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
    {
        /* override message */
    }
}

但是这仅捕获了DataType批注

TLDR;如何只写[Required]时如何获得[Required(ErrorMessage =“ Le champ {0} est obligatoire”)]的行为据我了解,文档没有提供隐式的方法...

asp.net-core-2.1
1个回答
0
投票

在.Net Core 2中,Accessor中的ModelBindingMessageProvider属性是只读的,但是您仍然可以使用Set...Accessor()方法进行设置。由于ASP.NET Core Model Binding Error Messages Localization的答案,这里的代码类似于我正在使用的代码。

public static class ModelBindingConfig
{
    public static void Localize(MvcOptions opts)
    {
        opts.ModelBindingMessageProvider.SetMissingBindRequiredValueAccessor(
            x => string.Format("A value for the '{0}' property was not provided.", x)
        );

        opts.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor(
            () => "A value is required."
        );
    }
}


// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddMvc(
        opts =>
        {
            ModelBindingConfig.Localize(opts);
        })
        .AddViewLocalization()
        .AddDataAnnotationsLocalization();
}
© www.soinside.com 2019 - 2024. All rights reserved.