比如我们的登录的页面是不需要加通用模板的,通过@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()
方法中进行资源清理工作,如释放订阅、取消网络请求等。根据你的具体需求,你可以根据情况进行实现。