2016-11-05 17 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

カスタムTagHelperにIHtmlHelperの注入を要求することが可能である:

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実際には[コンポーネントの表示](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components)が存在するため、悪い習慣になる可能性があります。 – Chedy2149

関連する問題