2012-11-23 88 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实例。最后,您可能会发现将模板作为所需输出的主要来源,并且在您的视图和外部使用此模板比其他方式更容易。