如何在 ASP.NET Core 中的 razor 视图中渲染之前检查视图组件是否存在
How to check if view component exists before rendering in razor view in ASP.NET Core
ASP.NET Core 有 View Components 重用部分视图的机制。您可以使用 Component.InvokeAsync
调用将视图组件包含在剃刀模板文件中:
@await Component.InvokeAsync("MyComponent", new { data = 1 })
如果具有给定名称的视图组件不存在,则抛出 InvalidOperationException
异常。
InvalidOperationException: A view component named 'MyComponent' could not be found.
我想知道如何在 Razor 视图中渲染之前检查视图组件是否存在。理想情况下是这样的:
@if (Component.Exists("MyComponent")
{
@await Component.InvokeAsync("MyComponent", new { data = 1 })
}
else
{
<p>Component not found</p>
}
您可以将 IViewComponentSelector
注入您的视图以检查组件是否存在:
@inject Microsoft.AspNetCore.Mvc.ViewComponents.IViewComponentSelector selector
@if (selector.SelectComponent("MyComponent")!= null)
{
@await Component.InvokeAsync("MyComponent", new { data = 1 })
}
else
{
<p>Component not found</p>
}
@adem 的回答可能对您的问题是最正确的,但您可以添加编译时安全性并通过他的 class 名称调用视图组件。
我相信这是一个更清洁的解决方案。
两个选项查看组件定义:
1 - 删除 ViewComponent 后缀
public class MyComponent : ViewComponent
2 - 添加 [ViewComponent] 属性
[ViewComponent(Name = "MyComponent")]
public class MyComponentViewComponent : ViewComponent
调用组件:
@await Component.InvokeAsync(nameof(MyComponent))
如果组件不存在,将抛出编译错误。
ASP.NET Core 有 View Components 重用部分视图的机制。您可以使用 Component.InvokeAsync
调用将视图组件包含在剃刀模板文件中:
@await Component.InvokeAsync("MyComponent", new { data = 1 })
如果具有给定名称的视图组件不存在,则抛出 InvalidOperationException
异常。
InvalidOperationException: A view component named 'MyComponent' could not be found.
我想知道如何在 Razor 视图中渲染之前检查视图组件是否存在。理想情况下是这样的:
@if (Component.Exists("MyComponent")
{
@await Component.InvokeAsync("MyComponent", new { data = 1 })
}
else
{
<p>Component not found</p>
}
您可以将 IViewComponentSelector
注入您的视图以检查组件是否存在:
@inject Microsoft.AspNetCore.Mvc.ViewComponents.IViewComponentSelector selector
@if (selector.SelectComponent("MyComponent")!= null)
{
@await Component.InvokeAsync("MyComponent", new { data = 1 })
}
else
{
<p>Component not found</p>
}
@adem 的回答可能对您的问题是最正确的,但您可以添加编译时安全性并通过他的 class 名称调用视图组件。 我相信这是一个更清洁的解决方案。
两个选项查看组件定义:
1 - 删除 ViewComponent 后缀
public class MyComponent : ViewComponent
2 - 添加 [ViewComponent] 属性
[ViewComponent(Name = "MyComponent")]
public class MyComponentViewComponent : ViewComponent
调用组件:
@await Component.InvokeAsync(nameof(MyComponent))
如果组件不存在,将抛出编译错误。