Как проверить, существует ли компонент представления перед рендерингом в представлении бритвы в 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.

Я хотел бы знать, как я могу проверить, существует ли компонент представления перед рендерингом в виде бритвы. В идеале что-то вроде:

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

person Mariusz Jamro    schedule 14.08.2016    source источник


Ответы (2)


Вы можете ввести 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>
}
person adem caglin    schedule 14.08.2016
comment
Это подтверждает ошибку, которую я получаю, что он не находит его, но я не знаю почему, потому что он не дает никакой другой подсказки, почему он не находит компонент. См. stackoverflow.com/questions/ 43902264/ - person Lord of Scripts; 12.05.2017

Ответ @adem может быть наиболее правильным для вашего вопроса, но вы можете добавить безопасность времени компиляции и вызвать компонент представления по имени его класса. Я считаю, что это более чистое решение.

Два варианта просмотра определения компонента:

1 - Удалить суфикс ViewComponent

public class MyComponent : ViewComponent

2 - Добавьте атрибут [ViewComponent]

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

Чтобы вызвать компонент:

@await Component.InvokeAsync(nameof(MyComponent))

Если компонент не существует, выдается ошибка компиляции.

person João Pereira    schedule 13.09.2016