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

Blazor中MudNavLink重复高亮,如何通过代码取消选中状态?

.NET 8 Blazor InteractiveServer中MudNavLink高亮状态不自动取消的解决方法

手动控制选中状态的方案

可以通过绑定Active属性并跟踪当前路由路径,强制控制每个MudNavLink的高亮状态:

1. 在组件中注入NavigationManager并跟踪路径

@inject NavigationManager NavManager
@implements IDisposable

@code {
    private string? _currentPath;

    protected override void OnInitialized()
    {
        // 初始化当前路径
        _currentPath = NavManager.Uri;
        // 监听路由变化事件
        NavManager.LocationChanged += OnLocationChanged;
    }

    private void OnLocationChanged(object? sender, LocationChangedEventArgs e)
    {
        _currentPath = e.Location;
        // 通知组件更新UI
        StateHasChanged();
    }

    // 判断当前路径是否匹配菜单链接的Href
    private bool IsActive(string href)
    {
        // 处理根路径的特殊情况,避免匹配所有子路径
        if (href == "/")
        {
            return _currentPath == "/";
        }
        return _currentPath?.StartsWith(href, StringComparison.OrdinalIgnoreCase) == true;
    }

    // 清理事件订阅
    public void Dispose()
    {
        NavManager.LocationChanged -= OnLocationChanged;
    }
}

2. 修改MudNavLink绑定Active属性

把每个MudNavLink的Active属性绑定到上面的IsActive方法,传入对应的Href值:

<MudNavMenu Bordered="true">
    <MudText Typo="Typo.h6" Class="px-4 pt-2">My App</MudText>
    <br />
    <br />
    <MudNavLink Href="/" Icon="@Icons.Material.Filled.Dashboard" IconColor="Color.Primary" Active="@IsActive("/")">Dashboard</MudNavLink>
    <MudNavLink Href="/people" Icon="@Icons.Material.Filled.People" IconColor="Color.Secondary" Active="@IsActive("/people")">People</MudNavLink>
    <MudNavLink Href="/billing" Disabled="true" Icon="@Icons.Material.Filled.Receipt">Billing</MudNavLink>
    <MudNavGroup Title="Settings" Icon="@Icons.Material.Filled.Settings">
        <MudNavLink Href="/users" Icon="@Icons.Material.Filled.People" IconColor="Color.Success" Active="@IsActive("/users")">Users</MudNavLink>
        <MudNavLink Href="/security" Icon="@Icons.Material.Filled.Security" IconColor="Color.Info" Active="@IsActive("/security")">Security</MudNavLink>
    </MudNavGroup>
</MudNavMenu>

问题原因分析

这个问题确实和.NET 8 Blazor的InteractiveServer渲染模式有关,MudBlazor的内置路由匹配逻辑在该模式下可能存在兼容性问题,导致组件无法正确识别路由变化并更新旧项的高亮状态。手动绑定Active属性可以完全绕过组件的自动判断逻辑,直接通过当前路由路径精确控制每个菜单的选中状态。

另外,也可以尝试升级MudBlazor到最新稳定版本,官方后续的更新通常会修复.NET版本适配的问题,但手动控制的方案可以作为即时解决手段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:26:06