Шаблон T4 и Server.MapPath - PullRequest
       12

Шаблон T4 и Server.MapPath

3 голосов
/ 11 января 2010

Я пытаюсь получить имена папок внутри папки Views, используя шаблон T4, и он продолжает выдавать мне следующие ошибки:

Ошибка 3 Компиляция преобразования: имя «Сервер» не существует в текущем контексте c: \ Projects \ LearningASPMVC \ LearningASPMVCSolution \ LearningMVC \ StronglyTypedViews.tt 20 47
Ошибка 4 Пространство имен не содержит непосредственно членов, таких как поля или методы C: \ Projects \ LearningASPMVC \ LearningASPMVCSolution \ LearningMVC \ StronglyTypedViews.cs 1 1 LearningMVC

Вот шаблон 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 #> { } 


     <# } #>        

}

ОБНОВЛЕНИЕ: Работает, используя физический путь:

<#@ 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()  #>";

     <# } #>



     <#  } #>

     }




}

1 Ответ

12 голосов
/ 12 января 2010

Шаблоны T4 выполняются во временном контексте, который создает Visual Studio, и находятся далеко за пределами вашего веб-приложения. Этот временный контекст предназначен для генерации выходного текстового файла. Это никоим образом не веб-приложение, оно не связано с веб-приложением, которое вы создаете. В результате, System.Web.HttpContext не имеет назначенного значения, и MapPath () не может быть вызвано.

Environment.CurrentDirectory тоже не сильно помогает, так как шаблон выполняется в некоторой временной папке.

Что вы можете сделать? Если вы можете использовать абсолютные пути, продолжайте и сделайте это. В противном случае добавление специфичного для хоста атрибута в директиву <# @ template #> позволит вам перейти к переменной Host и ее ResolvePath () метод. ResolvePath позволяет разрешать пути относительно самого файла TT.

Например (example.tt):

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

Вывод (example.cs):

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

Пост Олега Сыча о директиве шаблона содержит раздел об атрибуте хоста.

...