是否可以从自定义 TagHelper 调用 ViewComponent?

Ill*_*llI 3 c# asp.net-core asp.net-core-tag-helpers asp.net-core-viewcomponent

我正在编写一个自定义 TagHelper,并希望在其中呈现一个 ViewComponent。类似于 vc:xyz 标签助手所做的事情,但以更可控的方式,以便我可以在运行时确定要呈现哪个 ViewComponent。

是否可以?

Ill*_*llI 6

为此,您需要将 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请记住,自闭合标签将不起作用:

<widget name="abc" />
Run Code Online (Sandbox Code Playgroud)

请改用此表格:

<widget name="abc"></widget>
Run Code Online (Sandbox Code Playgroud)