ASP.NET Core MVC中如何限制用户编辑接口的ID参数为整数类型?
如何在ASP.NET Core MVC中限制路由参数仅为整数类型
你已经找对了方向,只差关键的一步——给路由参数加上类型约束!默认情况下,如果路由里只写{id},ASP.NET Core会尝试把传入的字符串转换成方法参数的类型(比如你方法里的int id),但这种方式不够严谨,还可能引发模型绑定异常。更好的做法是直接让非整数的URL不匹配目标方法,直接返回404,这样更符合路由设计的规范。
下面给你两种最常用的解决方法:
方法一:使用属性路由添加类型约束(推荐,更灵活)
直接在Edit方法的路由属性里给id加上:int约束,这样只有当URL里的id是整数时,才会匹配这个方法。代码示例如下:
创建用户的GET方法
// 匹配 /Admin/User [HttpGet] [Route("Admin/User")] public IActionResult Create() { // 编写创建新用户的逻辑,比如返回创建视图 return View(); }
编辑用户的GET方法(带int约束)
// 仅匹配 /Admin/User/123 这类整数ID的URL [HttpGet] [Route("Admin/User/{id:int}")] public IActionResult Edit(int id) { // 根据id查询用户并返回编辑视图 var user = _userService.GetUserById(id); if (user == null) { return NotFound(); } return View(user); }
设置完成后,当你访问/Admin/User/ABCD时,因为ABCD不是整数,这个路由不会匹配Edit方法,ASP.NET Core会去寻找其他可能匹配的路由,如果没有的话就直接返回404 NotFound,完美达到你要的限制效果。
方法二:修改全局路由模板(适合统一配置)
如果你更倾向于用全局路由而非属性路由,可以在Program.cs(ASP.NET Core 6+)或者Startup.cs里配置带约束的路由规则,确保带整数ID的Admin/User路由优先匹配:
var builder = WebApplication.CreateBuilder(args); // 添加MVC服务 builder.Services.AddControllersWithViews(); var app = builder.Build(); // 配置路由 app.UseRouting(); app.MapControllerRoute( name: "adminUserEdit", // 这里的{id:int}就是约束,仅匹配整数ID pattern: "Admin/User/{id:int}", defaults: new { controller = "Admin", action = "Edit" } ); // 默认路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" ); app.Run();
额外注意事项
- 路由匹配是有顺序的,更具体、带约束的路由要放在前面,否则默认路由可能会先匹配到不符合要求的URL。
- 如果你之前的Edit方法没有加
[Route]属性,而是依赖默认路由,那一定要确保全局路由里的约束配置正确,或者直接改用属性路由更直观。
内容的提问来源于stack exchange,提问作者Jenan
相关产品推荐
相关产品推荐

