是否可以从自定义TagHelper调用ViewComponent?
我正在编写一个自定义TagHelper,并希望在其中呈现ViewComponent。 类似于vc:xyz标签帮助器的东西,但是以更加受控的方式,这样我就可以在运行时确定要渲染哪个ViewComponent。
可能吗?
为此,您需要将IViewComponentHelper注入TagHelper,对其进行上下文化,然后根据您的应用程序逻辑使用它来呈现任何ViewComponent。 这是一个快速说明:
[HtmlTargetElement("widget", Attributes = WidgetNameAttributeName)] public class WidgetTagHelper : TagHelper { private const string WidgetNameAttributeName = "name"; private readonly IViewComponentHelper _viewComponentHelper; public WidgetTagHelper(IViewComponentHelper viewComponentHelper) { _viewComponentHelper = viewComponentHelper; } [HtmlAttributeNotBound] [ViewContext] public ViewContext ViewContext { get; set; } [HtmlAttributeName(WidgetNameAttributeName)] public string Name { get; set; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { ((IViewContextAware)_viewComponentHelper).Contextualize(ViewContext); var content = await _viewComponentHelper.InvokeAsync(typeof(WidgetViewComponent), new { name = Name }); output.Content.SetHtmlContent(content); } }
另外,请记住,自动关闭标签不起作用:
请改用此表格:
跟进答案 。
调用标记帮助程序时无需编写结束标记。 只需在ProcessAsync中设置TagMode :
output.TagMode = TagMode.StartTagAndEndTag; output.Content.SetHtmlContent(content);
然后
完全正常。
或者,您可以渲染视图组件的内容来代替widget
标记,而无需呈现标记本身:
output.SuppressOutput(); output.PostElement.SetHtmlContent(content);
我还注意到在视图组件的视图中添加自闭合标记会使它们在最终结果中显示错误,但这可能是一个不同的主题。
- AspNet.Security.OpenIdConnect.Server。 刷新令牌
- 在将.NET Core控制台应用程序部署到Azure WebJobs时加载hostpolicy.dll时出错
- 在ASP.NET Core 2.0中找不到AddJsonOptions
- MVC 6 Controller中的ControllerContext和ViewEngines属性在哪里?
- 我应该如何将一个DbContext实例注入IHostedService?
- 工厂模式与开放的generics
- 我在哪里可以记录ASP.NET Core应用程序的启动/停止/错误事件?
- Http错误的自定义错误页面404.13 ASP.NET Core MVC
- .NET Core 2.1 HttpClient不返回预期值