.NET 5.0 Razor Pages项目中.razor页面访问报"页面找不到"错误求助
项目问题描述
基于.NET 5.0的Razor Pages项目需同时兼容.cshtml页面与.razor页面,后续逐步全量迁移至.razor实现。当前已实现在.cshtml中正常嵌入调用Razor组件,但独立.razor页面无法访问,始终返回无法找到此页面错误。已参考多篇ASP.NET Core混合托管Razor Pages与Blazor页面的教程,问题仍未解决。
现有配置明细
Startup.cs 相关配置
services.AddServerSideBlazor(); // 端点映射配置 endpoints.MapBlazorHub(); endpoints.MapFallbackToFile("/_Host.cshtml");
根目录 _Imports.razor
@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop
Pages目录下 App.razor
@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="@typeof(Program).Assembly}"> <Found Context="routeData"> <RouteView RouteData="@routeData"/> </Found> <NotFound> <h1>Page not found123</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
Pages目录下 _Host.cshtml
@page "/blazor" @{ Layout = "_Layout"; } <div id="app"> @(await Html.RenderComponentAsync<App>(RenderMode.Server)) </div>
Pages/Shared目录下 _Layout.cshtml
<script src="_framework/blazor.server.js"></script> @RenderSection("Scripts", required: false)
待测试页面 Pages/Test.razor
@page "/test" @implements IDisposable <div>test</div>
问题根因
- 语法错误:
App.razor中Router组件的AppAssembly参数表达式多了一个多余的右花括号,直接导致组件编译失败,路由无法正常扫描所有带@page特性的Razor组件。 - 端点配置逻辑错误:
- 误用
MapFallbackToFile方法处理动态Razor Pages页面:该方法仅适用于返回wwwroot目录下的静态文件,无法路由到_Host.cshtml这类动态编译的Razor页面。 - Fallback路径与实际Host页面路由不匹配:当前
_Host.cshtml仅挂载在/blazor路径下,配置的fallback目标路径/_Host.cshtml在服务器端根本不存在,收到未匹配的请求(如/test)时直接返回404,无法进入Blazor客户端路由环节。 - 缺失Razor Pages端点映射:未显式调用
MapRazorPages()注册Razor Pages路由,破坏原有cshtml页面的路由匹配逻辑。
- 误用
- 路由挂载范围缺失:
_Host.cshtml仅配置了固定路径/blazor,未配置通配符子路径支持,无法承接Blazor路由的深层路径请求。
修正步骤
- 修正
App.razor的语法错误,删除多余的右花括号:
@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="@routeData"/> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
- 修正
_Host.cshtml的路由配置,增加通配符路径支持:
@page "/blazor/{*path:nonfile}" @{ Layout = "_Layout"; } <div id="app"> @(await Html.RenderComponentAsync<App>(RenderMode.Server)) </div>
- 修正
Startup.cs的服务与端点配置:- 在
ConfigureServices方法中添加services.AddRazorPages();注册Razor Pages服务 - 在
Configure方法的端点映射中调整逻辑,优先匹配Razor Pages路由,未匹配的请求统一回落到Host页面:
- 在
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapBlazorHub(); // 对Blazor路由使用MapFallbackToPage方法,指向Host页面的实际路由路径 endpoints.MapFallbackToPage("/blazor/{*path:nonfile}", "/_Host"); });
- 确认项目文件(.csproj)已启用Razor组件编译支持:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <RazorCompileOnBuild>true</RazorCompileOnBuild> </PropertyGroup> </Project>
内容的提问来源于stack exchange,提问作者Daria Kurochkina
相关产品推荐
相关产品推荐

