【问题标题】:How to render a Razor template inside a custom TagHelper in ASP.NET Core?如何在 ASP.NET Core 的自定义 TagHelper 中呈现 Razor 模板?
【发布时间】:2017-03-19 04:41:23
【问题描述】:

我正在创建一个自定义 HTML 标签助手:

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 吗?
是否可以参考剃须刀引擎?

【问题讨论】:

    标签: c# razor asp.net-core tag-helpers


    【解决方案1】:

    可以在自定义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 的评论。

    【讨论】:

    • 这被认为是不好的做法吗?我们应该在 TagHelpers 中使用 IHtmlHelper 吗?
    • @Dave 实际上这可能是一个不好的做法,因为 View Components 存在。
    【解决方案2】:

    在 Chedy 的答案中添加一个小(但很重要)的补充(这是正确的),此代码可以在基类中使用:

    public class PartialTagHelperBase : TagHelper
    {
        private IHtmlHelper                         m_HtmlHelper;
    
        public ShopStreetTagHelperBase(IHtmlHelper htmlHelper)
        {
            m_HtmlHelper = htmlHelper;
        }
    
        [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }
    
        protected async Task<IHtmlContent> RenderPartial<T>(string partialName, T model)
        {
            (m_HtmlHelper as IViewContextAware).Contextualize(ViewContext);
    
            return await m_HtmlHelper.PartialAsync(partialName, model);
        }
    }
    

    所以,继承PartialTagHelperBase可以帮助以一种非常简单有效的方式渲染部分视图:

            IHtmlContent someContent = await RenderPartial<SomeModel>("_SomePartial", new SomeModel());
    
            output.PreContent.AppendHtml(someContent);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 2022-01-20
      • 2020-02-19
      • 1970-01-01
      • 2020-04-03
      相关资源
      最近更新 更多