如何仅允许通过自定义路由访问Razor Pages页面,禁用原文件名URL?
解决Razor Pages禁止直接访问页面文件名的问题
你遇到的问题在于,options.Conventions.Clear()是清除全局的路由约定,但并没有移除单个页面的默认路由(比如/ListVehicles对应ListVehicles.cshtml的默认映射)。要实现仅允许通过/vehicle-list访问页面,需要明确替换或禁用该页面的默认路由,以下是两种可靠的解决方案:
方案1:直接在页面文件中修改@page指令
这是最简单的方式,直接在ListVehicles.cshtml的顶部修改@page指令,指定唯一的路由路径:
@page "/vehicle-list" @model YourNamespace.Pages.ListVehiclesModel <!-- 页面内容 -->
这样配置后,该页面只会响应/vehicle-list路径,用户输入/ListVehicles会直接返回404,完全符合你的需求。
方案2:在Startup.cs中集中配置路由约定
如果你希望在Startup中统一管理路由,可以通过修改页面的路由约定来实现:
services.AddMvc().AddRazorPagesOptions(options => { // 针对ListVehicles页面,先清除所有现有路由约定 options.Conventions.Add((pageConvention) => { if (pageConvention.PageName == "/ListVehicles") { pageConvention.RouteConventions.Clear(); // 添加自定义路由约定,仅允许/vehicle-list访问 pageConvention.RouteConventions.Add(new PageRouteConvention("/vehicle-list")); } }); });
或者你也可以用更简洁的组合方式:
services.AddMvc().AddRazorPagesOptions(options => { // 添加自定义路由映射 options.Conventions.AddPageRoute("/ListVehicles", "/vehicle-list"); // 移除该页面的默认路由(/ListVehicles) options.Conventions.RemovePageRoute("/ListVehicles"); });
这个方法的核心是先添加自定义路由,再移除页面的默认路由,确保只有你指定的路径能访问到页面。
需要注意的是,如果你使用的是.NET 6及以上的最小API模式,配置代码应该放在Program.cs的builder.Services.AddRazorPages()之后,用.AddRazorPagesOptions()来配置即可。
内容的提问来源于stack exchange,提问作者firebird
相关产品推荐
相关产品推荐

