这肯定可以做到,但你需要使用不同的扩展方法而不是RenderPartial
,因为这些方法直接写入响应。我尝试了Partial
扩展方法,它返回MvcHtmlString
,在模板中工作得很好。这是我的测试T4运行时模板,RuntimeTextTemplate1.tt:
<
<
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
需要一个
ViewContext
和
IViewDataContainer
来创建,而这些又有其他依赖关系。我使用一些虚拟类从控制器提供了所需的内容:
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)
{
}
}
public class ControllerViewDataContainer : IViewDataContainer
{
private Controller controller;
public ViewDataDictionary ViewData
{
get { return controller.ViewData; }
set { }
}
public ControllerViewDataContainer(Controller controller)
{
this.controller = controller;
}
}
我成功地从中获得了模板的输出。
虽然这可以完成,但具体取决于您的情况,您需要如何使用它,您的视图是如何参数化的,以及您如何组装所需的类以获取 HtmlHelper
实例。
最终,您可能会发现,将模板作为所需输出的主要来源,并在视图内外使用它比反过来容易。