Localisation et DataAnnotations. GlobalResourceProxyGenerator et PublicResxFileCodeGenerator

Pourquoi les atsortingbuts DataAnnotation ont-ils de la difficulté à accéder aux ressources créées par PublicResxFileCodeGenerator?

Je trouve que l’atsortingbut suivant:

[Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(Resources.Global))] 

La ressource ne sera pas trouvée si elle a été créée avec PublicResxFileCodeGenerator. Cependant, une ressource identique créée avec GlobalResourceProxyGenerator fonctionnera correctement. Les deux fichiers de ressources sont définis sur Contenu et résident dans App_GlobalResources. J’ai aussi essayé de mettre la langue par défaut dans App_LocalResources mais cela ne semble pas faire de différence. Mon test consiste à vérifier que ma langue secondaire (GlobalResourceProxyGenerator) fonctionne, mais ma langue principale (PublicResxFileCodeGenerator) lève une exception (la recherche du fichier de ressources échoue). Si je passe tous les deux à GlobalResourceProxyGenerator alors tout va bien (mais évidemment, il n’y a pas d’access public).

Quelqu’un sait pourquoi c’est comme cela? J’aimerais déplacer les ressources dans une autre assemblée à l’avenir.

En effet, vous avez placé votre fichier de ressources dans le dossier App_GlobalResources , qui est un dossier spécial dans ASP.NET. Cela devrait fonctionner si vous mettez votre fichier de ressources ailleurs. Cela pourrait également être un projet complètement séparé de votre application ASP.NET MVC.

Voici les étapes à suivre pour réussir ce travail:

  1. Créer une nouvelle application ASP.NET MVC 3 à l’aide du modèle Internet par défaut
  2. Ajouter un fichier ~/Messages.resx contenant la chaîne de ressource RegisterModel_ConfirmPasswordError
  3. Définissez l’outil personnalisé sur PublicResXFileCodeGenerator pour ce fichier de ressources:

    entrez la description de l'image ici

  4. Ajouter un modèle:

     public class MyViewModel { [Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(MvcApplication1.Messages))] public ssortingng Password { get; set; } public ssortingng NewPassword { get; set; } } 
  5. Manette:

     public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel()); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 
  6. Vue:

     @model MyViewModel @using (Html.BeginForm()) { 
    @Html.LabelFor(x => x.Password) @Html.EditorFor(x => x.Password) @Html.ValidationMessageFor(x => x.Password)
    @Html.LabelFor(x => x.NewPassword) @Html.EditorFor(x => x.NewPassword) @Html.ValidationMessageFor(x => x.NewPassword)
    }

Ensuite, vous pouvez commencer à localiser en fournissant les traductions respectives:

  • Messages.fr-FR.resx
  • Messages.de-DE.resx
  • Messages.it-IT.resx
  • Messages.es-ES.resx

METTRE À JOUR:

On m’a demandé dans la section commentaires ce qui était si spécial à propos du dossier App_GlobalResources et pourquoi cela ne fonctionnait pas. Eh bien, en fait, vous pourriez le faire fonctionner. Tout ce que vous avez à faire est de définir l’ Build Action de Embedded Resource . Par défaut, lorsque vous ajoutez un fichier au dossier App_GlobalResources , Visual Studio le définit sur Content ce qui signifie que cette ressource ne sera pas incorporée à l’assembly d’exécution et que ASP.NET MVC ne le trouvera pas:

entrez la description de l'image ici