Razor Pages未显示预期HTML内容的问题排查
问题原因
ASP.NET的路由匹配遵循注册优先原则,你先注册了控制器路由,所以请求/Parks/{id}/Details会被Park控制器的Details方法优先捕获,而不会匹配到自定义的Razor Pages页面。
解决方案
1. 调整路由注册顺序
在program.cs中,将MapRazorPages()移至控制器路由之前,让Razor Pages路由优先匹配请求:
app.UseEndpoints(endpoints => { // 优先注册Razor Pages路由 endpoints.MapRazorPages(); endpoints.MapControllerRoute( name: "parks", pattern: "Parks/{id}/{action=Details}", defaults: new { controller = "Park" }); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
2. 确认Razor Pages的路由指令
在每个Parks/{id}/Details.cshtml页面顶部,添加明确的@page指令,确保路由模板与请求路径完全匹配:
@page "/Parks/{id}/Details" @model YourProjectNamespace.Parks.[ParkId].DetailsModel <!-- 页面自定义内容 -->
如果ID是整数类型,可以加上类型约束以提高匹配精度:@page "/Parks/{id:int}/Details"
3. 优化导航链接(可选)
避免硬编码路径,使用Url.Page()生成Razor Pages的正确链接,防止路径错误:
<a href="@Url.Page($"/Parks/{park.Id}/Details")" class="dropdown-item"> <picture> <source media="(min-width:768px)" srcset="@park.DropdownImage"> <img src="#" alt="@park.ParkName Menu" width="134" height="128"> </picture> <p>@park.ParkName</p> </a>
替代方案(无需调整路由顺序)
如果不想修改路由注册顺序,可以修改控制器路由的模板,让它与Razor Pages路径区分开,比如将控制器路由的pattern改为"Park/{id}/{action=Details}"(去掉末尾的s),此时控制器路径为/Park/1/Details,Razor Pages路径为/Parks/1/Details,两者自然不会冲突。
内容的提问来源于stack exchange,提问作者acekensei
相关产品推荐
相关产品推荐

