ASP.NET Core 2.0 Razor Pages多路径路由配置问题
解决ASP.NET Core 2.0 Razor Pages中间可选路径段的路由问题
我完全懂你遇到的这个麻烦——Razor Pages默认的路由模板里,可选段(?)确实只能生效在最后一个路径部分,没法直接处理中间的可选[segment]。不过有几种靠谱的方式能实现你要的双路由映射需求:
方法1:通过路由约定注册多个路由模板
最直接的方案是在Startup.cs的ConfigureServices中,给目标页面添加两个独立的路由模板,记得把更具体的(带segment的)路由放在前面,保证路由匹配的优先级正确:
services.AddRazorPages() .AddRazorPagesOptions(options => { // 注册带segment的路由(更具体,优先匹配) options.Conventions.AddPageRoute( pagePath: "/Shop/MyPage", // 替换成你的页面实际物理路径 routeTemplate: "{language}/{segment}/shop/mypage" ); // 注册不带segment的路由 options.Conventions.AddPageRoute( pagePath: "/Shop/MyPage", routeTemplate: "{language}/shop/mypage" ); });
这样两个URL就会精准指向同一个MyPageModel,完全满足你的需求。
方法2:在页面模型中捕获路由参数
不管用哪种路由配置方式,你都可以通过[FromRoute]属性在PageModel里获取language和segment参数,然后根据segment是否为null执行不同逻辑:
public class MyPageModel : PageModel { [FromRoute] public string Language { get; set; } [FromRoute] public string Segment { get; set; } // 访问不带segment的URL时,此值为null public IActionResult OnGet() { if (!string.IsNullOrEmpty(Segment)) { // 处理带segment的业务逻辑 } else { // 处理不带segment的业务逻辑 } return Page(); } }
额外提示
- 路由顺序不能乱:一定要把包含segment的更具体路由放在前面,避免路由匹配时出现歧义。
- 如果多个页面都需要这种模式,可以把路由注册逻辑封装成自定义的
IPageRouteModelConvention,减少重复代码。
内容的提问来源于stack exchange,提问作者Robert Corvus
相关产品推荐
相关产品推荐

