Anduvimos buscando por el mundo on line para de esta forma regalarte la respuesta a tu dilema, si tienes alguna inquietud puedes dejar la inquietud y respondemos porque estamos para servirte.
Solución:
Para personalizar los mensajes de error de vinculación del modelo de marco, debe configurar accesos personalizados para diferentes accesores 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):
- r-aghaei / AspNetCoreLocalizationSample
También aquí puedes ver el ejemplo, en vivo:
- aspnetcorelocalizationsample.azurewebsites.net
Mensajes de error predeterminados
Estos son mensajes de error predeterminados que muestra el marco 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 de ASP.NET Core
Para localizar los mensajes de error de enlace de modelos de ASP.NET Core, siga estos pasos:
-
Crear archivo de recursos – Cree un archivo de recursos en Recursos carpeta en su solución y nombre el archivo ModelBindingMessages.fa.resx. El nombre puede ser cualquier otro nombre, pero lo usaremos para crear un localizador. En el ejemplo, usé fa Cultura (persa).
-
Agregar claves de recursos – Abra el archivo de recursos y agregue keys y valores que desee utilizar para localizar mensajes de error. solía keys y valores como la imagen de abajo:
Las claves que utilicé son como mensajes originales, excepto el key por
ValueMustNotBeNull
que era lo mismo queValueIsInvalid
, entonces usé El valor nulo no es válido. para ello. -
Configurar opciones – En
ConfigureServices
método, al agregarMvc
, configure sus opciones para establecer accesos de mensajes paraModelBindingMessageProvider
:public void ConfigureServices(IServiceCollection services) services.AddLocalization(options => options.ResourcesPath = "Resources"; ); services.AddMvc(options => var F = services.BuildServiceProvider().GetService
(); var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample"); options.ModelBindingMessageProvider.ValueIsInvalidAccessor = (x) => L["The value '0' is invalid.", x]; options.ModelBindingMessageProvider.ValueMustBeANumberAccessor = (x) => L["The field 0 must be a number.", x]; 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 (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 de
Configure
método: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 de modelos tienen solo lectura, pero se ha agregado un método de establecimiento para cada propiedad.
Por ejemplo, para establecer
ValueIsInvalidAccessor
, Deberías usarSetValueIsInvalidAccessor()
método de esta manera:options.ModelBindingMessageProvider.SetValueIsInvalidAccessor ( (x) => L["The value '0' is invalid.", x]);
Con referencia a esta publicación que describe en detalle los efectos secundarios del uso de BuildServiceProvider dentro de ConfigureServices, y a esta respuesta con respecto a la resolución de servicios dentro de ConfigureServices, por último, pero no menos importante, considerando la respuesta mejorada referida por Andrew Lock, el enfoque correcto para localizar el error de enlace del modelo los mensajes deben ser mediante la creación de una clase de configuración personalizada que implemente IConfigureOptions
luego regístrelo en el inicio de la siguiente manera:
public class ConfigureModelBindingLocalization : IConfigurationOptions
private readonly IServiceScopeFactory _serviceFactory;
public ConfigureModelBindingLocalization(IServiceScopeFactory serviceFactory)
_serviceFactory = serviceFactory;
public void Configure(MvcOptions options)
using(var scope = _serviceFactory.CreateScope())
var provider = scope.ServiceProvider;
var localizer = provider.GetRequiredService();
options.ModelBindingMessageProvider.SetAttemptedValueIsInvalidAccessor((x, y) =>
localizer["The value '0' is not valid for 1.", x, y]);
options.ModelBindingMessageProvider.SetMissingBindRequiredValueAccessor((x) =>
localizer["A value for the '0' parameter or property was not provided.", x]);
options.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor(() =>
localizer["A value is required."]);
options.ModelBindingMessageProvider.SetMissingRequestBodyRequiredValueAccessor(() =>
localizer["A non-empty request body is required."]);
options.ModelBindingMessageProvider.SetNonPropertyAttemptedValueIsInvalidAccessor((x) =>
localizer["The value '0' is not valid.", x]);
options.ModelBindingMessageProvider.SetNonPropertyUnknownValueIsInvalidAccessor(() =>
localizer["The supplied value is invalid."]);
options.ModelBindingMessageProvider.SetNonPropertyValueMustBeANumberAccessor(() =>
localizer["The field must be a number."]);
options.ModelBindingMessageProvider.SetUnknownValueIsInvalidAccessor((x) =>
localizer["The supplied value is invalid for 0.", x]);
options.ModelBindingMessageProvider.SetValueIsInvalidAccessor((x) =>
localizer["The value '0' is invalid.", x]);
options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor((x) =>
localizer["The field 0 must be a number.", x]);
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor((x) =>
localizer["The value '0' is invalid.", x]);
Finalmente registre la nueva clase de configuración en el inicio:
public void ConfigureServices(IServiceCollection services)
// ...
services.AddSingleton, ConfigureModelBindingLocalization>();
// ...
Te mostramos las reseñas y valoraciones de los lectores
Acuérdate de que te damos el privilegio interpretar tu experiencia si diste con la solución.