ASP.NET Core 6 MVC如何在MapControllerRoute中定义路由变量类型
ASP.NET Core 6 MVC 中MapControllerRoute路由变量类型/匹配规则配置
在app.MapControllerRoute()中定义路由变量的类型、格式匹配规则,是通过路由约束参数实现的,和你贴出的旧版路由写法逻辑一致,具体实现如下:
正确配置代码
在Program.cs的中间件配置段,写入如下路由配置即可:
// 其他中间件配置(如静态文件、身份认证等) app.MapControllerRoute( name: "MoviesByReleaseDate", pattern: "movies/released/{year}/{month}", defaults: new { controller = "Movies", action = "ByReleaseDate" }, constraints: new { year = @"\d{4}", // 限定year匹配4位数字 month = @"\d{2}" // 限定month匹配2位数字 } ); // 默认兜底路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
配置说明
- 第四个参数
constraints就是专门用来定义路由变量约束的位置,支持传入正则表达式、内置类型约束来限定变量的格式、类型,不符合约束规则的请求路径不会匹配到当前路由。 - 你原有代码中Action名写为
"ByRelease Date"带空格是笔误,C#方法名不允许包含空格,需要和控制器中实际的Action方法名完全一致,这里修正为"ByReleaseDate"。 - 如果需要做更严格的规则校验,可以调整正则表达式,比如把month的规则改成
@"0[1-9]|1[0-2]",就可以过滤掉13、00这类无效月份的路径。
匹配效果示例
可正常匹配的路径:
/movies/released/2024/10,会路由到Movies控制器下的ByReleaseDate方法,方法可直接接收year=2024、month=10两个参数
无法匹配的路径:/movies/released/24/5,因为年份只有2位、月份只有1位,不满足约束规则,不会命中该路由。
内容的提问来源于stack exchange,提问作者Jordi van Cuijlenborg
相关产品推荐
相关产品推荐

