net iviewlocalizer asp and adddataannotationslocalization c# .net localization asp.net-core asp.net-core-localization

c# - iviewlocalizer - globalization and localization asp net core



LocalizaciĆ³n de mensajes de error de enlace de modelo principal de ASP.NET (1)

Para personalizar los mensajes de error de enlace del modelo de marco, debe configurar ModelBindingMessageProvider personalizados para diferentes ModelBindingMessageProvider de mensajes de error de ModelBindingMessageProvider .

Ejemplo

Aquí puede descargar un código fuente completo de lo que se describe en esta publicación. El repositorio contiene un ejemplo para ASP.NET Core 2.0 (VS 2017.3) y ASP.NET Core 1.1 (VS 2015) :

También aquí puedes ver el ejemplo, en vivo:

Mensajes de error predeterminados

Estos son mensajes de error predeterminados que el marco muestra cuando falla el enlace del modelo a una propiedad:

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.

Además de los mensajes anteriores, ASP.NET Core 2.0 también tiene estos mensajes:

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.

Localizar mensajes de error de enlace de modelos básicos de ASP.NET

Para localizar los mensajes de error de enlace del modelo Core de ASP.NET, siga estos pasos:

  1. Crear archivo de recursos : cree un archivo de recursos en la carpeta Recursos de su solución y nombre el archivo ModelBindingMessages.fa.resx . El nombre puede ser cualquier otra cosa, pero lo usaremos para crear un localizador. En el ejemplo, utilicé la cultura fa (persa).

  2. Agregar claves de recursos : abra el archivo de recursos y agregue claves y valores que desee utilizar para localizar los mensajes de error. Utilicé claves y valores como la imagen de abajo:

    Las claves que utilicé son como los mensajes originales, excepto la clave de ValueMustNotBeNull que era igual a ValueIsInvalid , por lo que utilicé el valor nulo no es válido. para ello.

  3. Opciones de configuración : en el método ConfigureServices , al agregar Mvc , configure sus opciones para configurar los ModelBindingMessageProvider mensajes para 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; }); }

    También agregue este código al comienzo del método de Configure :

    var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("fa") }; app.UseRequestLocalization(new RequestLocalizationOptions() { DefaultRequestCulture = new RequestCulture(new CultureInfo("en")), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures });

Nota importante para ASP.NET Core 2.0

En ASP.NET Core 2.0, las propiedades del proveedor de mensajes de enlace del modelo solo tienen lectura, pero se ha agregado un método de establecimiento para cada propiedad.

Por ejemplo, para establecer ValueIsInvalidAccessor , debe usar el método SetValueIsInvalidAccessor() esta manera:

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

Estoy usando ASP.NET Core y tratando de localizar la aplicación. Me las arreglé para usar los nuevos recursos básicos de asp .net para localizar los controladores y las vistas, y los recursos antiguos para localizar los mensajes de error para la validación del modelo. Sin embargo, cuando el mensaje de error no está vinculado a una anotación de campo del modelo (como "Requerido") y los datos para el enlace del modelo son incorrectos (como un texto en el que se espera un número), recibo el error como se muestra a continuación. no se puede localizar:

"El valor ''abc'' no es válido para ID".

Cuando ingreso abc para la propiedad ID en la View , ya que el enlace del modelo no se puede hacer en el campo y muestra un mensaje de validación cerca del campo, que dice "El valor ''abc'' no es válido para la ID". . Aquí está la clase que estoy usando:

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*/ }

Los problemas similares que encontré en Internet estaban dirigidos a una versión anterior de asp .net o no me ayudaron a resolver el problema.