Saltar al contenido

Localización de mensajes de error de enlace de modelo de ASP.NET Core

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:

  1. 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).

  2. 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:

    ingrese la descripción de la imagen aquí

    Las claves que utilicé son como mensajes originales, excepto el key por ValueMustNotBeNull que era lo mismo que ValueIsInvalid, entonces usé El valor nulo no es válido. para ello.

  3. Configurar opciones – En ConfigureServices método, al agregar Mvc, configure sus opciones para establecer accesos de mensajes para ModelBindingMessageProvider:

    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 usar SetValueIsInvalidAccessor()
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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *