Che*_*149 4 c# razor tag-helpers asp.net-core
我正在创建一个自定义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);
}
}
Run Code Online (Sandbox Code Playgroud)
如何以编程方式呈现部分视图并在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);
}
}
Run Code Online (Sandbox Code Playgroud)
IHtmlHelper提供的实例尚未准备好使用,因此有必要将其上下文化,因此需要(html as IViewContextAware).Contextualize(ViewContext);声明。
IHtmlHelper.Partial然后可以使用该方法生成模板。
幸得frankabbruzzese他的评论对基金从标签辅助渲染局部模板。
在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,继承PartialTagHelperBase可以帮助以一种非常简单有效的方式渲染部分视图:
IHtmlContent someContent = await RenderPartial<SomeModel>("_SomePartial", new SomeModel());
output.PreContent.AppendHtml(someContent);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |