2011-02-02 4 views
2

Je l'ai remarqué quand je le suit à mon avis:T4MVC ne supporte pas DisplayTemplates et EditorTemplates

<% Html.RenderPartial(MVC.Shared.Views.EditorTemplates.ClientOnDocuments); %> 

La ligne ci-dessus retourne juste le nom de la vue, dans ce cas ClientOnDocuments. Le moteur d'affichage par défaut entre alors dans et tente de trouver dans le dossier de la vue en cours et dans le dossier partagé, mais pas dans le dossier DisplayTemplates et EditorTemplates. Depuis que je suis allé assez loin avec mon utilisation de T4MVC je ne veux pas le vider ou mélanger différents styles de vues de référence (par exemple, ce qui précède fonctionne si nous fournissons le chemin vers le modèle).

La raison se trouve dans ce code qui génère T4MVC:

public class ViewNames { 
    ... 
     public readonly string FirmHeader = "~/Views/Shared/FirmHeader.ascx"; 
     public readonly string PostsSelector = "~/Views/Shared/PostsSelector.ascx"; 
     static readonly _DisplayTemplates s_DisplayTemplates = new _DisplayTemplates(); 
     public _DisplayTemplates DisplayTemplates { get { return s_DisplayTemplates; } } 
     public partial class _DisplayTemplates{ 
      public readonly string ClientOnDocuments = "ClientOnDocuments"; 
      public readonly string DateTime = "DateTime"; 
     } 
     static readonly _EditorTemplates s_EditorTemplates = new _EditorTemplates(); 
     public _EditorTemplates EditorTemplates { get { return s_EditorTemplates; } } 
     public partial class _EditorTemplates{ 
      public readonly string ClientOnDocuments = "ClientOnDocuments"; 
      public readonly string DateTime = "DateTime"; 
      public readonly string PostCode = "PostCode"; 
     } 

Vous pouvez voir que le point de vue contenu dans tout racine commune est bien, mais apparemment, il ne gère pas les sous-dossiers bien.

Je sais que je pourrais changer le fichier de modèle T4MVC mais aimerais vraiment une réponse de David Ebbo sur s'il va changer/corriger ceci.

J'espère qu'il suit SO, au moins je l'ai vu ici en décembre.

+1

ce qui serait encore mieux est d'avoir deux classes: ViewNames (qui ne contiendrait que les noms des vues) et ViewPaths, qui contiendraient les chemins, de cette façon nous aurions accès aux noms et chemins fortement typés. – mare

Répondre

4

Fait intéressant, ce comportement différent a été délibérément mis en place après qu'un autre utilisateur a rencontré des problèmes. Recherchez ce dans le T4MVC.settings.t4:

// Views in DisplayTemplates and EditorTemplates folders shouldn't be fully qualifed as it breaks 
// the templated helper code 
readonly string[] NonQualifiedViewFolders = new string[] { 
    "DisplayTemplates", 
    "EditorTemplates" 
}; 

Donc, normalement, sous-dossiers obtenir des chemins complets, mais seulement ces deux ne le font pas.

Je pense que la différence était que cet utilisateur appelait DisplayFor/EditorFor pour les afficher pendant que vous appeliez RenderPartial.

Dans tous les cas, puisque c'est dans le fichier de paramètres et non le modèle principal, vous pouvez simplement changer la liste si vous ne voulez pas que le comportement, à savoir

readonly string[] NonQualifiedViewFolders = new string[] { }; 

Hope this helps! :)

+0

parfait, David. – mare

+0

Donc, en utilisant cela, vous pouvez vous référer au chemin de la vue via T4MVC, mais alors DisplayFor/EditorFor ne pourrait pas trouver les vues, n'est-ce pas? Dommage, car il y a une vue DisplayTemplates que j'utilise à la fois via DisplayFor et dans un PartialViewResult (dans des contextes différents). Je suppose que je vais devoir écrire le chemin qualifié comme une chaîne dans le contrôleur si je veux continuer à utiliser DisplayFor. – adamjford

+0

Pour DisplayTemplates et EditorTemplates, ne pourrions-nous pas simplement avoir de nouvelles propriétés pour le chemin complet et l'autre pour le comportement attendu? – PBo

Questions connexes