2010-01-11 5 views
3

Je suis en train d'obtenir les noms de dossier dans le dossier Vues utilisant le modèle T4 et il continue à me donner les erreurs suivantes:T4 Modèle et Server.MapPath

Erreur 3 transformation Compiler: Le nom « serveur » n'existe pas dans le contexte actuel c: \ Projects \ LearningASPMVC \ LearningASPMVCSolution \ LearningMVC \ StronglyTypedViews.tt 20 47
Erreur 4 Un espace de noms ne contient pas directement des membres tels que des champs ou des méthodes C: \ Projects \ LearningASPMVC \ LearningASPMVCSolution \ LearningMVC \ StronglyTypedViews.cs 1 1 LearningMVC

Voici le modèle T4:

<#@ template language="C#" debug="True" hostspecific="True" #> 
<#@ output extension=".cs" #> 

<#@ assembly name="System.Web" #> 

<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Web" #> 


using System; 



namespace StronglyTypedViews 
{ 

    <# 

    string[] folders = Directory.GetDirectories(Server.MapPath("Views")); 

    foreach(string folderName in folders) 
    { 

    #> 

    public static class <#= folderName #> { } 


    <# } #>   

} 

MISE À JOUR: obtenu ce travail en utilisant le chemin physique:

<#@ template language="C#" debug="True" hostspecific="True" #> 
<#@ output extension=".cs" #> 

<#@ assembly name="System.Web" #> 
<#@ assembly name="System.Web.Mvc" #> 


<#@ import namespace="System.Web.Mvc" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Web" #> 


using System; 

namespace StronglyTypedViews 
{ 

    <# 

    string viewsFolderPath = @"C:\Projects\LearningASPMVC\LearningASPMVCSolution\LearningMVC\"; 

    string[] folders = Directory.GetDirectories(viewsFolderPath + "Views"); 


    foreach(string folderName in folders) 
    { 

    #> 

    public static class <#= System.IO.Path.GetFileName(folderName) #> {   
    <#  
     foreach(string file in Directory.GetFiles(folderName))  { 
     #>   
     public const string <#= System.IO.Path.GetFileNameWithoutExtension(file) #> = "<#= System.IO.Path.GetFileNameWithoutExtension(file).ToString() #>"; 

    <# } #> 



    <# } #> 

    } 




} 
+0

Le problème est que HttpContext.Current est null! – azamsharp

Répondre

11

modèles T4 sont exécutés dans un contexte temporaire qui crée le studio visuel, et est bien en dehors de votre application web. Ce contexte temporaire est destiné à générer le fichier texte en sortie. Il ne s'agit en aucun cas d'une application Web et n'est pas liée à l'application Web que vous créez. Par conséquent, System.Web.HttpContext n'a aucune valeur affectée et MapPath() ne peut pas être appelé.

Environnement.CurrentDirectory n'est pas très utile non plus, car le modèle est exécuté dans un dossier temporaire.

Que pouvez-vous faire? Si vous pouvez utiliser des chemins absolus, allez-y et faites-le. Dans le cas contraire, en ajoutant la hostspecific attribut dans le < # @ # modèle> directive vous permettra de la hôte variables et sa méthode ResolvePath(). ResolvePath vous permet de résoudre les chemins relatifs au fichier TT lui-même.

Par exemple (example.tt):

<#@ template language="C#" hostspecific="True" #> 
<#@ output extension=".cs" #> 
// <#=Host.ResolvePath(".")#> 

sortie (example.cs):

// C:\Users\myusername\Documents\Visual Studio 2008\Projects\MvcApplication1\MvcApplication1\. 

Oleg Sych's post about the template directive a une section sur l'attribut hostspecific.

+0

Je l'ai eu le travail! Merci – azamsharp

Questions connexes