Blazor Server中多个@page "/"路由的选择逻辑:为何优先_Host.cshtml?
Blazor Server路由优先级的判定逻辑
首先要搞清楚这两个文件的本质区别:
_Host.cshtml是Razor Page文件,属于ASP.NET Core传统的Razor Pages路由体系,本身就能直接响应HTTP请求。Index.razor是Blazor组件,它的路由由Blazor框架内部的Router组件处理,而Blazor组件必须依托_Host.cshtml这类宿主页面才能渲染。
路由匹配的顺序
ASP.NET Core的请求处理管道是按注册顺序执行的,Razor Pages的路由中间件会先于Blazor的路由逻辑运行:
- 当请求
/路径时,ASP.NET Core先扫Razor Pages的路由表,发现_Host.cshtml带了@page "/",直接匹配成功,返回该页面内容,请求流程到此结束。 - 只有当Razor Pages没匹配到对应路径时,请求才会流转到Blazor的
Router组件,这时Blazor才会去匹配内部组件的路由(比如Index.razor的@page "/")。
设计原因
- 兼容现有生态:Blazor是基于ASP.NET Core构建的,得和已有的Razor Pages、MVC等路由体系共存,所以遵循「先传统路由,后Blazor路由」的顺序,确保老项目迁移到Blazor时不会乱套。
- 宿主页面的特殊性:
_Host.cshtml是Blazor应用的入口,负责加载Blazor运行时(比如_framework/blazor.server.js)。如果让Blazor组件路由先匹配,宿主页面的加载逻辑根本跑不起来,Blazor应用也就启动不了。
解决办法
要是想让Blazor组件的/路由生效,直接删掉_Host.cshtml里的@page "/"指令就行。默认的Blazor Server模板里,_Host.cshtml本来就没有这个指令,它作为宿主不需要直接响应路由请求,内部组件的路由交给Blazor的Router接管就好。
内容的提问来源于stack exchange,提问作者jaime
相关产品推荐
相关产品推荐

