Search code examples
c#razorasp.net-coretag-helpers

How to render a Razor template inside a custom TagHelper in ASP.NET Core?


I am creating a custom HTML Tag Helper:

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);
        }
    }

How to render a partial view programatically an get the rendered content as a string inside TagHelper.ProcessAsync ?
Should I request the injection of an IHtmlHelper ?
Is it possible to get a reference to the razor engine ?


Solution

  • It is possible to request the injection of an IHtmlHelper in the custom 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);
            }
        }
    

    The IHtmlHelper instance provided is not ready for use and it is necessary to contextualize it, hence the (html as IViewContextAware).Contextualize(ViewContext); statement.

    The IHtmlHelper.Partial method can then be used to generate the template.

    Credit goes to frankabbruzzese for his comment on Facility for rendering a partial template from a tag helper.