.NET 9 Blazor中NavMenu使用InteractiveServer渲染模式与带[Authorize]特性页面的冲突问题求助
大家好,我现在在开发一个基于.NET 9的Blazor Web应用,核心需求是让NavMenu.razor里的导航菜单支持客户端与服务端的C#交互,所以需要给它加上@rendermode InteractiveServer渲染模式。比如我有一段折叠菜单的NavLink代码是这样的:
<NavLink class="@(navSubmenu == NavSubmenu.FirstSubM ? "nav-link custom-active-main" : "nav-link")" @onclick="() => TogleSubmenu(NavSubmenu.FirstSubM)"> <span class="bi bi-boxes-nav-menu" aria-hidden="true"></span> <div class="d-flex justify-content-between align-items-center"> <div><span>Products</span></div> <div class="px-2 d-flex align-items-center justify-content-center"> <span class="@(navSubmenu == NavSubmenu.FirstSubM ? "custom-bi bi-chevron-up-sub-menu" : "custom-bi bi-chevron-down-sub-menu")" aria-hidden="true"></span> </div> </div> </NavLink>
这类带交互逻辑的NavLink还有好几个实例。
最开始我是在NavMenu组件的定义级别加的@rendermode InteractiveServer,结果发现带[Authorize]特性的Auth.razor页面出现了异常行为:比如当用户未认证时,尝试访问/auth页面,权限控制的逻辑完全不对,本该拦截跳转的情况没有正常触发。
于是我尝试把渲染模式移到每个NavLink实例上,改成<NavLink @rendermode="InteractiveServer"...>的写法,结果直接抛出了错误:
InvalidOperationException: Cannot pass the parameter 'ChildContent' to component 'NavLink' with rendermode 'InteractiveServerRenderMode'. This is because the parameter is of the delegate type 'Microsoft.AspNetCore.Components.RenderFragment', which is arbitrary code and cannot be serialized.
这里补充下Auth.razor的代码:
@page "/auth" @using Microsoft.AspNetCore.Authorization @attribute [Authorize] <PageTitle>Auth</PageTitle> <h1>You are authenticated</h1> <AuthorizeView> Hello @context.User.Identity?.Name! </AuthorizeView>
对应的导航菜单里的Auth链接是这样的:
<div class="nav-item px-3"> <NavLink class="nav-link" href="auth"> <span class="bi bi-lock-nav-menu" aria-hidden="true"></span> Auth Required </NavLink> </div>
看起来是[Authorize]特性和NavMenu的InteractiveServer渲染模式产生了冲突,有没有哪位朋友遇到过同样的问题?如果我既要保留导航菜单的客户端-服务端交互能力,又要让带[Authorize]特性的页面正常工作,该怎么解决这个冲突呢?
内容来源于stack exchange

