【发布时间】:2020-06-29 21:57:51
【问题描述】:
我有一个解决方案,它同时具有 ASP.NET Core 3.1 Web 应用程序项目和 Razor 客户端库 (RCL) 项目。我正在尝试编写一个视图组件,该组件将与 Razor 客户端库一起分发,但可以从 ASP.NET Core Web 应用程序中引用。
当我在 Web 应用程序的 _Layout.cshtml 上调用 InvokeAsync() Tag Helper 时,我可以成功呈现此 ViewComponent:
@await Component.InvokeAsync("NavBar", new {})
但我想让 RCL 不依赖于 Web 应用程序上提供的字符串名称。相反,我希望喜欢通过这样的扩展方法调用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()。
据我所知,返回ViewComponents 的两种方式在功能上是等效的并且使用相同的方法,除了@{ await Component.RenderMyViewComponentAsync(); } 首先通过一个辅助函数。
我尝试了两种方式调试,但无济于事。我被卡住了!
有什么方法可以实现我在这里的要求吗?如果需要任何澄清,请询问。
【问题讨论】:
标签: c# razor extension-methods asp.net-core-3.1 asp.net-core-viewcomponent