我有一个既有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)项目的解决方案。我正在尝试编写一个视图组件,该组件将与...
您的扩展方法实际上完全可以正常工作。问题在于您如何从_Layout.cshtml
调用它。您正在使用以下语法: