2012-11-23 124 views
4

我想知道是否可以在預處理器模板中採用現有的部分視圖的邏輯並將其用於動態電子郵件生成?T4中的RenderPartial()模板

當通過T4ToolKit的智能感知選項尋找

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

MVC的命名空間沒有出現,這可能包括命名空間,並從預處理器模板中調用

Html.RenderPartial("viewName", this.Model)

<#@ template language="C#" #> 
This is a header 
<#= Html.RenderPartial("<%PATH%>/MyPartialRazerView", this.Model) #> 
This is a Footer 
<#+ 
    public MyType Model { get; set; } 
#> 

,所以我可以編程方式訪問我的模板,重用視圖的顯示邏輯而建,說在飛行的郵件(我知道的電子郵件線是廢話,只是短手爲簡單起見)

var template = MyTemplate(){ Model = MyViewModel }; 

Email.Send(emailAddress, title, template.TransformText(), null) etc.. 

TIA

回答

0

這可以肯定的,但你需要使用不同的推廣方法比RenderPartial,因爲這些直接寫RES ponse。我試過Partial擴展方法,它返回在模板中正常工作的MvcHtmlString。這是我的測試T4模板運行時,RuntimeTextTemplate1.tt:

<#@ template language="C#" #> 
<#@ import namespace="System.Web.Mvc.Html" #> 
LogOnPartial: 
<#= Html.Partial("_LogOnPartial") #> 

然後你還需要一些跳躍ASP.NET MVC箍,以獲得實際HtmlHelper實例到您的模板。

我創建了一個局部類,到Html屬性添加到模板和實例化HtmlHelper,並提供一個構造函數:

public partial class RuntimeTextTemplate1 
{ 
    public HtmlHelper Html 
    { 
     get; 
     private set; 
    } 

    public RuntimeTextTemplate1(ViewContext viewContext, IViewDataContainer viewDataContainer) 
    { 
     Html = new HtmlHelper(viewContext, viewDataContainer); 
    } 
} 

一個HtmlHelper需要ViewContextIViewDataContainer創建和那些反過來有另一個依賴關係。我提供了使用一些虛擬類從控制器需要什麼:

public class HomeController : Controller 
{ 
    public ActionResult TemplateTest() 
    { 
     var viewContext = new ViewContext(ControllerContext, new DummyView(), ViewData, TempData, TextWriter.Null); 
     var template = new RuntimeTextTemplate1(viewContext, new ControllerViewDataContainer(this)); 
     return Content(template.TransformText()); 
    } 
} 

public class DummyView : IView 
{ 
    public void Render(ViewContext viewContext, TextWriter writer) 
    { 
     // Do nothing 
    } 
} 

public class ControllerViewDataContainer : IViewDataContainer 
{ 
    private Controller controller; 

    public ViewDataDictionary ViewData 
    { 
     get { return controller.ViewData; } 
     set { } 
    } 

    public ControllerViewDataContainer(Controller controller) 
    { 
     this.controller = controller; 
    } 
} 

我順利拿到模板輸出出來。

所以,雖然這可以完成,但這取決於您的具體情況,您需要如何使用它,您的視圖如何參數化,以及如何將所需的類組裝到一起以獲得HtmlHelper實例。最後,您可能會發現將模板作爲所需輸出的主要來源,並且在您的視圖和外部使用此模板比其他方式更容易。