比如我们的登录的页面是不需要加通用模板的,通过@if 控制 RouteView的DefaultLayout即可
<BootstrapBlazorRoot><Router AppAssembly="@typeof(App).Assembly"><Found Context="routeData"><PageTitle>Title</PageTitle>@if (routeData.PageType == typeof(BlazorApp.Pages.Login)){<RouteView RouteData="@routeData" />}else{<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />}<FocusOnNavigate RouteData="@routeData" Selector="h1" /></Found><NotFound><PageTitle>Not found</PageTitle><LayoutView Layout="@typeof(MainLayout)"><p> 正在玩命开发中 ...</p></LayoutView></NotFound></Router>
</BootstrapBlazorRoot>
上面的方式适合静态配置,一般页面菜单都是动态,可以用下面的方式实现
@inject DataService dataService@implements IDisposable@if (showTemplate)
{<RouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)" />
}
else
{<RouteView RouteData="routeData" DefaultLayout="" />
}@code {private bool showTemplate;private RouteData routeData;protected override async Task OnInitializedAsync(){// 从后台获取数据var data = await dataService.GetData();// 根据获取到的数据判断是否需要使用模板if (data.NeedsTemplate){showTemplate = true;}else{showTemplate = false;}// 设置路由数据routeData = GetRouteData();await base.OnInitializedAsync();}private RouteData GetRouteData(){// 获取路由数据的方法(根据你的实际情况编写)// 返回你想要的路由数据对象}public void Dispose(){// 在需要释放资源时进行清理工作(根据你的需求进行实现)}
}
在上述示例中,我们通过 @inject
指令注入了一个名为 DataService
的服务,用于获取后台数据。在 OnInitializedAsync
生命周期方法中,我们通过调用 dataService.GetData()
方法获取数据,并根据数据的特定属性进行条件判断。根据判断结果,我们设置 showTemplate
变量来决定是否使用模板。
然后,我们使用 @if
语句根据 showTemplate
的值来选择性地设置 DefaultLayout
属性。如果 showTemplate
为 true
,则应用默认的模板布局;如果为 false
,则不应用任何模板。
最后,我们还定义了 GetRouteData()
方法来获取自定义的路由数据,并将该数据赋值给 routeData
变量。
请注意,在使用 implements IDisposable
的情况下,我们可以在 Dispose()
方法中进行资源清理工作,如释放订阅、取消网络请求等。根据你的具体需求,你可以根据情况进行实现。