如何在 ASP.NET Core 中的自定义 TagHelper 中呈现 Razor 模板?
How to render a Razor template inside a custom TagHelper in ASP.NET Core?
我正在创建自定义 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 吗?
是否可以获得对剃刀引擎的引用?
可以请求在自定义 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 for his comment on Facility for rendering a partial template from a tag helper。
在 Chedy 的答案(正确的答案)中添加一个小的(但很重要的)补充,此代码可用于基础 class:
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);
我正在创建自定义 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 吗?
是否可以获得对剃刀引擎的引用?
可以请求在自定义 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 for his comment on Facility for rendering a partial template from a tag helper。
在 Chedy 的答案(正确的答案)中添加一个小的(但很重要的)补充,此代码可用于基础 class:
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);