web-dev-qa-db-fra.com

Localisation des messages d'erreur de liaison de modèle ASP.NET Core

J'utilise ASP.NET Core et j'essaie de localiser l'application. J'ai réussi à utiliser new asp .net core resources pour localiser les contrôleurs et les vues, et old resources pour localiser les messages d'erreur pour la validation du modèle. Cependant, lorsque le message d'erreur n'est pas lié à une annotation de champ de modèle (comme "Obligatoire") et que les données de liaison du modèle sont incorrectes (comme un texte où un nombre est attendu), je reçois l'erreur comme ci-dessous, que je suis impossible de localiser:

"La valeur 'abc' n'est pas valide pour l'ID."

Lorsque j'entre abc pour la propriété ID dans View, car la liaison de modèle ne peut pas être effectuée sur le champ et elle affiche un message de validation près du champ, disant "La valeur 'abc' n'est pas valide pour l'ID.". Voici la classe que j'utilise:

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

Les problèmes similaires que j'ai trouvés sur Internet étaient ciblés sur une ancienne version asp .net, ou bien ne m'ont pas aidé à résoudre le problème.

18
Marko

Pour personnaliser les messages d'erreur de liaison du modèle de framework, vous devez définir des accesseurs personnalisés pour différents accesseurs de message d'erreur de ModelBindingMessageProvider .

Exemple

Ici, vous pouvez télécharger un code source complet de ce qui est décrit dans cet article. Le référentiel contient un exemple pour ASP.NET Core 2.0 (VS 2017.3) et ASP.NET Core 1.1 (VS 2015):

Ici aussi, vous pouvez voir l'exemple en direct:

Messages d'erreur par défaut

Ce sont des messages d'erreur par défaut que le framework affiche lorsque la liaison du modèle à une propriété échoue:

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.

En plus des messages ci-dessus, ASP.NET Core 2.0 contient également ces messages:

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.

Localiser les messages d'erreur de liaison de modèle ASP.NET Core

Pour localiser les messages d'erreur de liaison de modèle ASP.NET Core, procédez comme suit:

  1. Créer un fichier de ressources - Créez un fichier de ressources sous le dossier Resources dans votre solution et nommez le fichier ModelBindingMessages .fa.resx. Le nom peut être autre chose, mais nous l'utiliserons pour créer un localisateur. Dans l'exemple, j'ai utilisé la culture fa (perse).

  2. Ajouter des clés de ressources - Ouvrez le fichier de ressources et ajoutez les clés et les valeurs que vous souhaitez utiliser pour localiser les messages d'erreur. J'ai utilisé des clés et des valeurs comme l'image ci-dessous:

    enter image description here

    Les clés que j'ai utilisées sont comme des messages originaux, sauf la clé pour ValueMustNotBeNull qui était la même que ValueIsInvalid, donc j'ai utilisé La valeur nulle n'est pas valide. pour cela .

  3. Configurer les options - Dans la méthode ConfigureServices, lors de l'ajout de Mvc, configurez ses options pour définir les accesseurs de message pour 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;
        });
    }
    

    Ajoutez également ce code au début de la méthode Configure:

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

Remarque importante pour ASP.NET Core 2.0

Dans ASP.NET Core 2.0, les propriétés du fournisseur de messages de liaison de modèle sont en lecture seule, mais une méthode de définition pour chaque propriété a été ajoutée.

Par exemple, pour définir ValueIsInvalidAccessor, vous devez utiliser la méthode SetValueIsInvalidAccessor() de cette façon:

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