2016-11-05 92 views
3

我創建一個自定義HTML代碼助手:如何在ASP.NET Core的自定義TagHelper中渲染Razor模板?

public class CustomTagHelper : TagHelper 
    { 
     [HtmlAttributeName("asp-for")] 
     public ModelExpression DataModel { get; set; } 

     public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
     { 
      string content = RazorRenderingService.Render("TemplateName", DataModel.Model); 
      output.Content.SetContent(content); 
     } 
    } 

如何呈現局部視圖編程的得到呈現的內容作爲內TagHelper.ProcessAsync一個字符串?
我是否應該要求注入IHtmlHelper?
是否有可能獲得對剃刀引擎的參考?

回答

3

它可以請求IHtmlHelper注射自定義TagHelper:

public class CustomTagHelper : TagHelper 
    { 
     private readonly IHtmlHelper html; 

     [HtmlAttributeName("asp-for")] 
     public ModelExpression DataModel { get; set; } 

     [HtmlAttributeNotBound] 
     [ViewContext] 
     public ViewContext ViewContext { get; set; } 

     public CustomTagHelper(IHtmlHelper htmlHelper) 
     { 
      html = htmlHelper; 
     } 
     public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
     { 
      //Contextualize the html helper 
      (html as IViewContextAware).Contextualize(ViewContext); 

      var content = await html.PartialAsync("~/Views/path/to/TemplateName.cshtml", DataModel.Model); 
      output.Content.SetHtmlContent(content); 
     } 
    } 

提供的IHtmlHelper實例不準備使用,這是必要的背景情況是,因此(html as IViewContextAware).Contextualize(ViewContext);聲明。

IHtmlHelper.Partial方法然後可以用於產生模板。

幸得frankabbruzzese爲他的Facility for rendering a partial template from a tag helper評論。

+0

這被認爲是不好的做法?我們應該在我們的TagHelpers中使用IHtmlHelper嗎? – Dave

+1

@Dave實際上它可能是一個不好的做法,因爲[View Components](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components)存在。 – Chedy2149