You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为未认证用户可访问页面配置不同的MainLayout继承?

实现Blazor页面分布局访问的方案

步骤1:提取公共基础布局(复用通用组件与样式)

创建BaseLayout.razor,把所有页面都需要的MudBlazor核心服务、主题、RTL配置抽离出来,避免重复代码:

<MudRTLProvider RightToLeft="@LayoutService.IsRTL">
    <MudDialogProvider/>
    <MudSnackbarProvider/>
    <MudThemeProvider @ref="@_mudThemeProvider" 
                     Theme="@LayoutService.CurrentTheme" 
                     IsDarkMode="@LayoutService.IsDarkMode" 
                     IsDarkModeChanged="@LayoutService.SetDarkMode"/>
    
    @Body
</MudRTLProvider>

@code {
    [Inject] protected LayoutService LayoutService { get; set; }
    private MudThemeProvider _mudThemeProvider;
}

步骤2:创建认证用户专用布局

创建AuthenticatedLayout.razor,继承BaseLayout,包含原MainLayout中认证用户可见的导航、头部等组件:

@inherits BaseLayout

<MudLayout>
    <HeaderMenu NavigationMenuDrawerOpen="_navigationMenuDrawerOpen"
                OpenSearchDialog="OpenSearchDialog"
                IsDarkMode="@LayoutService.IsDarkMode"
                ToggleNavigationMenuDrawer="ToggleNavigationMenuDrawer"
                RightToLeft="@LayoutService.IsRTL"
                RightToLeftToggle="LayoutService.ToggleRightToLeft"
                OnSettingClick="@(() => _themingDrawerOpen = true)"/>
    <NavigationMenu DrawerOpen="_navigationMenuDrawerOpen"
                    DrawerOpenChanged="NavigationMenuDrawerOpenChangedHandler"/>
    <ThemesMenu ThemingDrawerOpen="_themingDrawerOpen"
                ThemingDrawerOpenChanged="ThemingDrawerOpenChangedHandler"
                UserPreferences="_userPreferences"
                UserPreferencesChanged="LayoutService.UpdateUserPreferences"/>
    <ThemesButton OnClick="@(() => _themingDrawerOpen = true)"/>
    <MudMainContent>
        <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="mb-4 mt-4">
            <ErrorBoundary @ref="_errorBoundary">
                <ChildContent>
                    @Body
                </ChildContent>
                <ErrorContent Context="exception">
                    <CustomError Exception="exception"></CustomError>
                </ErrorContent>
            </ErrorBoundary>
        </MudContainer>
    </MudMainContent>
    <UserLoginState/>
</MudLayout>

@code {
    private bool _navigationMenuDrawerOpen;
    private bool _themingDrawerOpen;
    private ErrorBoundary _errorBoundary;
    private UserPreferences _userPreferences;

    private void ToggleNavigationMenuDrawer()
    {
        _navigationMenuDrawerOpen = !_navigationMenuDrawerOpen;
    }

    private void NavigationMenuDrawerOpenChangedHandler(bool value)
    {
        _navigationMenuDrawerOpen = value;
    }

    private void ThemingDrawerOpenChangedHandler(bool value)
    {
        _themingDrawerOpen = value;
    }

    private void OpenSearchDialog()
    {
        // 保留原搜索弹窗逻辑
    }
}

步骤3:创建匿名用户专用布局

创建AnonymousLayout.razor,继承BaseLayout,包含原MainLayout中匿名用户可见的登录提示等内容:

@inherits BaseLayout

<MudLayout>
    <MudContainer MaxWidth="MaxWidth.Small" Class="d-flex align-center" Style="height: 100vh;">
        <div class="d-flex flex-column mud-width-full">
            <MudPaper Elevation="25" Class="pa-8" Width="100%" MaxWidth="500px">
                <MudIcon Icon="@Icons.Custom.Brands.MudBlazor" Size="Size.Large" Style="width:100px; height:100px;"/>
                @Body
            </MudPaper>
            <MudAlert Severity="Severity.Info" Class="mt-8 mud-width-full" Style="max-width:500px;">
                @L["authentication is required, click"] <MudLink Href="/"> @L["sign in"]</MudLink>
            </MudAlert>
        </div>
    </MudContainer>
</MudLayout>

@code {
    [Inject] protected IStringLocalizer<SharedResource> L { get; set; }
}

步骤4:为页面指定对应布局

  • 需要认证的页面:在页面顶部添加@layout AuthenticatedLayout
  • 无需认证的页面:在页面顶部添加@layout AnonymousLayout

示例:

@page "/dashboard"
@layout AuthenticatedLayout

<h1>Dashboard</h1>
<!-- 页面内容 -->
@page "/public/about"
@layout AnonymousLayout

<h1>About Us</h1>
<!-- 公开页面内容 -->

步骤5:全局默认布局配置(可选)

如果大部分页面需要认证,可在_Imports.razor中设置全局默认布局:

@layout AuthenticatedLayout

这样仅少数公开页面需手动指定@layout AnonymousLayout即可。

原MainLayout的处理

可直接删除原MainLayout.razor,或改为其中一个布局的别名,避免路由引用报错。

内容的提问来源于stack exchange,提问作者Sachihiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:08:11