Шаблон T4 и Server.MapPath

Я пытаюсь получить имена папок внутри папки 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()  #>";

     <# } #>



     <#  } #>

     }




}

t4
person azamsharp    schedule 11.01.2010    source источник
comment
Проблема в том, что HttpContext.Current имеет значение null!   -  person azamsharp    schedule 11.01.2010


Ответы (1)


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

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

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

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

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

Вывод (пример.cs):

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

В сообщении Олега Сыча о директиве шаблона есть раздел об атрибуте hostspecific .

person Oren Trutner    schedule 12.01.2010