ASP.NET локализация сообщений об ошибках привязки базовой модели

Я использую ASP.NET Core и пытается локализовать приложение. Мне удалось использовать новая asp .net core ресурсы для локализации контроллеров и представлений и старый ресурсов для локализации сообщений об ошибках для проверки модели. Однако, когда сообщение об ошибке не связано с аннотацией поля модели (например, "требуется") , а данные для привязки модели неверны (например, текст, где ожидается число), я получаю ошибку, как показано ниже, которую я не могу локализовать:

"значение" abc " недопустимо для ID."

когда я вхожу abc на 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, либо не помогли мне решить проблему.

1 ответов


чтобы настроить сообщения об ошибках привязки модели фреймворка, необходимо установить пользовательские методы доступа для различных методов доступа к сообщениям об ошибках ModelBindingMessageProvider.

пример

здесь вы можете скачать полный исходный код того, что описано в этом посте. Репозиторий содержит пример дляASP.NET Core 2.0 (VS 2017.3) и ASP.NET ядро 1.1 (VS 2015):

также здесь вы можете увидеть пример, live:

Сообщения Об Ошибках По Умолчанию

это сообщения об ошибках по умолчанию, которые платформа показывает при сбое привязки модели к свойству:

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 сообщения об ошибках привязки основной модели, выполните следующие действия:

  1. Создать Файл Ресурсов - создайте файл ресурсов в разделе ресурсы папка в вашем решении и имя файла ModelBindingMessages.Фа.resx файл. Имя может быть чем угодно, но мы будем использовать его, чтобы создайте локализатор. В примере я использовал fa (персидской) культурой.

  2. Добавить Ключи Ресурсов - открыть файл ресурсов и добавить ключи и значения, которые вы хотите использовать для локализации сообщений об ошибках. Я использовал ключи и значения, как показано ниже:

    enter image description here

    ключи, которые я использовал, похожи на оригинальные сообщения, за исключением ключа для ValueMustNotBeNull что было то же самое, что ValueIsInvalid и значение null значение недопустимо. для него.

  3. Настройка Параметров - в 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."];
            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<RequestLocalizationOptions>(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

In ASP.NET Core 2.0, свойства поставщика сообщений привязки модели полученный только для чтения, но метод setter для каждого свойства был добавлен.

например, чтобы установить ValueIsInvalidAccessor, вы должны использовать SetValueIsInvalidAccessor() метод такой:

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