Blazor Server:如何获取PageTitle组件的当前设置值?
要在NavMenu组件里复用
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
相关产品推荐
相关产品推荐

