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 сообщения об ошибках привязки основной модели, выполните следующие действия:
Создать Файл Ресурсов - создайте файл ресурсов в разделе ресурсы папка в вашем решении и имя файла ModelBindingMessages.Фа.resx файл. Имя может быть чем угодно, но мы будем использовать его, чтобы создайте локализатор. В примере я использовал fa (персидской) культурой.
-
Добавить Ключи Ресурсов - открыть файл ресурсов и добавить ключи и значения, которые вы хотите использовать для локализации сообщений об ошибках. Я использовал ключи и значения, как показано ниже:
ключи, которые я использовал, похожи на оригинальные сообщения, за исключением ключа для
ValueMustNotBeNull
что было то же самое, чтоValueIsInvalid
и значение null значение недопустимо. для него. -
Настройка Параметров - в
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."]);