Как получить тип компонента из location / url / route

#blazor #.net-5 #blazor-routing

#blazor #.net-5 #blazor-маршрутизация

Вопрос:

Сценарий:

У меня есть серверное приложение Blazor с базовой маршрутизацией, и после навигации мне нужно проверить, реализует ли текущая страница определенный интерфейс. например:

 NavigationService.LocationChanged  = (sender, args) => 
{
  Type componentType = GetComponetFromLocation(args.Location);
  if (!componentType.GetInterfaces().Contains(typeof(PageBase)) {
  }
}
  

Вопрос:

Как мне получить тип компонента для текущего или определенного URL / местоположения?

Ответ №1:

Не уверен, чего именно вы пытаетесь достичь, но это может помочь:

App.razor

 <Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <CascadingValue Value="@routeData.PageType" Name="PageType" >
            <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        </CascadingValue>
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>
  

Поскольку тип страницы теперь передается как каскадное значение, вы можете:

 
@if(!PageType.IsSubclassOf(typeof(PageBase)))
{
    <div> ... </div>
}

@if(PageType.GetInterface("PageBase") == null)
{
    <div> ... </div>
}

@code {
    [CascadingParameter(Name="PageType")]
    public Type PageType { get; set; }
}

  

Я использовал @If здесь два блока, потому что в ваших вопросах говорится об интерфейсах, однако ваш пример, похоже, касается базового типа. Один из блоков должен удовлетворять вашим потребностям.

Ответ №2:

Вы можете добавить метод OnParametersSet в свой компонент mainLayout…

Также добавьте: @using System.Reflection;

 protected override void OnParametersSet()
{
    // Get the Component Type from the route data
    var component = (this.Body.Target as RouteView)?.RouteData.PageType;

    // Get a list of all the interfaces implemented by the component. 
    // It should be: IComponent, IHandleEvent, IHandleAfterRender,
    // Unless your routable component has derived from ComponentBase,
    // and added interface implementations of its own  
    var allInterfaces = component.GetInterfaces();
    
    
}