在T4模板中的RenderPartial()函数

4

我想知道是否可以使用现有的局部视图逻辑,在预处理器模板中重复使用它以生成动态电子邮件?

在查看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

1个回答

0

这肯定可以做到,但你需要使用不同的扩展方法而不是RenderPartial,因为这些方法直接写入响应。我尝试了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 实例。

最终,您可能会发现,将模板作为所需输出的主要来源,并在视图内外使用它比反过来容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接