如何在ASP.NET Core中的剃刀视图中渲染之前检查视图组件是否存在

本文关键字:视图 检查 存在 是否 组件 剃刀 ASP NET Core | 更新日期: 2023-09-27 18:02:23

ASP.NET Core具有用于重用部分视图的视图组件机制。您可以使用Component.InvokeAsync调用:将视图组件包含在剃刀模板文件中

@await Component.InvokeAsync("MyComponent", new { data = 1 })

如果具有给定名称的视图组件不存在,则引发InvalidOperationException异常。

InvalidOperationException: A view component named 'MyComponent' could not be found.

我想知道如何在剃刀视图中渲染之前检查视图组件是否存在。理想情况下类似于:

@if (Component.Exists("MyComponent")
{
    @await Component.InvokeAsync("MyComponent", new { data = 1 })
}
else
{
    <p>Component not found</p>
}

如何在ASP.NET Core中的剃刀视图中渲染之前检查视图组件是否存在

您可以将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的答案可能对您的问题最正确,但您可以添加编译时安全性,并通过他的类名调用视图组件。我相信这是一个更清洁的解决方案。

视图组件定义的两个选项

1-移除ViewComponent sufix

public class MyComponent : ViewComponent

2-添加[ViewComponent]属性

[ViewComponent(Name = "MyComponent")]
public class MyComponentViewComponent : ViewComponent

调用组件

@await Component.InvokeAsync(nameof(MyComponent))

如果组件不存在,则会引发编译错误。