#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();
}