从IViewComponentHelper扩展方法中调用Component.InvokeAsync()

问题描述 投票:1回答:1

我有一个既有ASP.NET Core 3.1 Web应用程序项目又有Razor客户端库(RCL)项目的解决方案。我正在尝试编写一个视图组件,该组件将与Razor客户端库一起分发,但可以从ASP.NET Core Web应用程序中引用。

当我在Web应用程序的ViewComponent上调用InvokeAsync()标记帮助程序时,我可以成功渲染此_Layout.cshtml:>

@await Component.InvokeAsync("NavBar", new {})

但是我想使RCL不依赖于Web应用程序上提供的字符串名称。相反,我会like

通过这样的扩展方法来调用ViewComponent
@{ await Component.RenderMyViewComponentAsync(); }

对我来说,这种方式对使用此共享RCL库的任何人都更有利,因为他们不需要指定ViewComponent的确切名称,并且可以依靠IntelliSense来完成扩展方法。

我创建了一个使用ViewComponent对象并简单地在扩展方法中调用其InvokeAsync()方法的助手类:

public static class PartialHelper
{
    public static async Task<IHtmlContent> RenderMyViewComponentAsync(this IViewComponentHelper vcHelper)
    {
        return await vcHelper.InvokeAsync("NavBar", new { });
    }
}

当然,在NavBarViewComponent.cs内部,我实现了InvokeAsync()方法:

public class NavBarViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        return View();
    }
}

不过,这是问题所在:尽管这两种方法仍然会击中我的NavBarViewComponent.InvokeAsync(),但我无法从后一种方法看到我的视图在屏幕上呈现。

据我所知,返回ViewComponent的两种方法在功能上都是等效的,并且使用相同的方法,只是@{ await Component.RenderMyViewComponentAsync(); }首先通过辅助函数。

我已经尝试了两种调试方式,但均无济于事。我被卡住了!

有什么方法可以实现我在这里要的?如果需要任何澄清,请询问。

我有一个既有ASP.NET Core 3.1 Web应用程序项目又有Razor客户端库(RCL)项目的解决方案。我正在尝试编写一个视图组件,该组件将与...

c# razor extension-methods asp.net-core-3.1 asp.net-core-viewcomponent
1个回答
0
投票

您的扩展方法实际上完全可以正常工作。问题在于您如何从_Layout.cshtml调用它。您正在使用以下语法:

© www.soinside.com 2019 - 2024. All rights reserved.