【问题标题】:How to check if view component exists before rendering in razor view in ASP.NET Core如何在 ASP.NET Core 的剃刀视图中渲染之前检查视图组件是否存在
【发布时间】:2016-08-14 09:49:16
【问题描述】:

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>
}

【问题讨论】:

    标签: c# razor asp.net-core asp.net-core-mvc asp.net-core-viewcomponent


    【解决方案1】:

    您可以将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>
    }
    

    【讨论】:

    • 这证实了我得到的错误,即它没有找到它,但我不知道为什么,因为它没有提供任何其他线索,为什么它没有找到该组件。见stackoverflow.com/questions/43902264/…
    【解决方案2】:

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

    查看组件定义的两个选项:

    1 - 删除 ViewComponent 后缀

    public class MyComponent : ViewComponent
    

    2 - 添加一个 [ViewComponent] 属性

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

    调用组件

    @await Component.InvokeAsync(nameof(MyComponent))
    

    如果组件不存在,则抛出编译错误。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      相关资源
      最近更新 更多