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

Blazor Server应用中.cshtml未通过App.razor管道渲染的问题

问题解答

是的,.cshtml页面(即Razor Pages)不遵循App.razor定义的组件层级进行渲染,具体原因和解决办法如下:

核心原因

  • App.razor是Blazor Server应用中Blazor组件体系的专属渲染入口,仅负责管理.razor组件的路由、嵌套层级和渲染流程。所有Blazor组件的渲染都会经过这个组件树,因此Setup.razor里的JS互操作逻辑能正常触发,为html标签添加data-bs-theme属性。
  • .cshtml属于Razor Pages,是ASP.NET Core独立于Blazor的页面模型,拥有完全独立的请求处理和渲染管道。当访问Razor Pages页面时,请求不会进入Blazor的组件渲染流程,自然不会触发App.razor中Setup组件的逻辑,导致html标签无法获得目标属性。

可行解决办法

  • 迁移到Blazor组件:如果业务允许,将.cshtml页面的内容重构为Blazor组件(.razor文件),这样就能直接复用App.razor的组件层级和Setup.razor的主题设置逻辑。
  • 在Razor Pages中单独添加逻辑:保留.cshtml页面的前提下,在页面的布局文件(如_Layout.cshtml)或页面本身嵌入相同的JS逻辑:
    <script>
        // 替换为你在Setup.razor中使用的主题值逻辑
        document.documentElement.setAttribute('data-bs-theme', 'dark');
    </script>
    
  • 通过中间件统一处理:编写ASP.NET Core中间件,在响应输出HTML时自动为根html标签添加data-bs-theme属性,这种方式对Blazor和Razor Pages页面均生效。

你提供的App.razor代码:

<CascadingAuthenticationState>
    <Setup>
        <Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
            <Found Context="routeData">
                <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
            </Found>
            <NotFound>
                <LayoutView Layout="@typeof(MainLayout)">
                    <Error Code="NotFound"></Error>
                </LayoutView>
            </NotFound>
        </Router>
    </Setup>
</CascadingAuthenticationState>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:00:47