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

Blazor Server:如何获取PageTitle组件的当前设置值?

在Blazor Server中获取的值并在NavMenu中渲染

要在NavMenu组件里复用设置的标题,核心思路是通过共享状态服务同步标题值——Blazor组件默认不直接共享状态,得有个中间载体来传递数据。下面是具体的实现步骤:

1. 创建共享的标题状态服务

先定义一个Scoped服务,用来存储和通知标题变化。这个服务需要包含可被组件监听的标题属性,确保页面标题更新时,NavMenu能收到通知并刷新UI:

public class TitleService
{
    private string _currentTitle = "默认标题";
    
    // 标题变化时触发的回调,供组件监听
    public event Action<string>? TitleChanged;

    public string CurrentTitle
    {
        get => _currentTitle;
        set
        {
            if (_currentTitle != value)
            {
                _currentTitle = value;
                TitleChanged?.Invoke(_currentTitle);
            }
        }
    }
}

2. 注册服务到依赖注入容器

在Program.cs中把这个服务注册为Scoped(每个用户会话一个实例,符合Blazor Server的会话隔离需求):

builder.Services.AddScoped<TitleService>();

3. 在页面中同步和服务的标题值

在页面组件里注入TitleService,设置<PageTitle>的同时更新服务的CurrentTitle属性。为了避免重复代码,也可以封装一个自定义组件替代原生<PageTitle>,自动同步到服务:

方案A:页面手动同步

@inject TitleService TitleService

<PageTitle>@PageHeading</PageTitle>

@code {
    private string PageHeading = "我的订单页面";

    protected override void OnInitialized()
    {
        TitleService.CurrentTitle = PageHeading;
    }
}

方案B:封装自定义同步组件(更优雅)

创建SharedPageTitle.razor组件,所有页面用这个组件就自动同步标题:

@inject TitleService TitleService
<PageTitle>@ChildContent</PageTitle>

@code {
    [Parameter] public RenderFragment ChildContent { get; set; } = default!;

    protected override void OnParametersSet()
    {
        // 提取ChildContent的文本作为标题(简单实现,复杂场景可调整)
        var titleText = ChildContent.GetContentText().Trim();
        TitleService.CurrentTitle = titleText;
    }
}

页面中直接使用这个组件替代原生<PageTitle>:

<SharedPageTitle>我的订单页面</SharedPageTitle>

4. 在NavMenu组件中订阅标题变化并渲染

最后在NavMenu.razor中注入TitleService,订阅标题变化事件,实时更新UI:

@inject TitleService TitleService
@implements IDisposable

<div class="top-row ps-3 navbar navbar-dark">
    <div class="container-fluid">
        <a class="navbar-brand" href="">@_currentTitle</a>
        <!-- 其他NavMenu内容 -->
    </div>
</div>

@code {
    private string _currentTitle = "默认标题";

    protected override void OnInitialized()
    {
        _currentTitle = TitleService.CurrentTitle;
        // 订阅标题变化事件
        TitleService.TitleChanged += OnTitleChanged;
    }

    private void OnTitleChanged(string newTitle)
    {
        _currentTitle = newTitle;
        // 通知组件刷新UI
        StateHasChanged();
    }

    // 取消订阅避免内存泄漏
    public void Dispose()
    {
        TitleService.TitleChanged -= OnTitleChanged;
    }
}

这样一来,当任何页面通过<PageTitle>(或自定义的SharedPageTitle)设置标题时,TitleService会同步更新,NavMenu会自动收到通知并渲染最新的标题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:45:28