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:
~/Messages.resx
contenant la chaîne de ressource RegisterModel_ConfirmPasswordError
Définissez l’outil personnalisé sur PublicResXFileCodeGenerator
pour ce fichier de ressources:
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; } }
Manette:
public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel()); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } }
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:
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: