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.
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
.
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:
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.
Pour localiser les messages d'erreur de liaison de modèle ASP.NET Core, procédez comme suit:
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).
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:
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 .
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
});
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éthodeSetValueIsInvalidAccessor()
de cette façon:options.ModelBindingMessageProvider.SetValueIsInvalidAccessor ( (x) => L["The value '{0}' is invalid."]);