ASP.NET Core 6.0 MVC路由:如何同时支持路径参数与查询参数?
问题原因
当前的[HttpGet("users/{userId}")]路由模板仅匹配URL路径中的路由参数(即users/7这种形式),而users?userid=7属于查询字符串参数,ASP.NET Core的路由系统找不到对应匹配的Action方法,因此返回404错误。
解决方案
有两种简洁的修改方式,都能同时支持两种请求格式:
方式一:调整路由模板并允许参数可选
修改路由模板为"users/{userId?}",让路由参数可选,ASP.NET Core会自动尝试从查询字符串绑定匹配名称的参数(默认不区分大小写):
[HttpGet("users/{userId?}")] public IActionResult GetUser(int userId) { ... }
注:即便
userId是必填参数,这种写法依然有效——当请求不带路由参数时,框架会自动从查询字符串获取userid的值。
方式二:显式指定参数的绑定来源
如果需要更明确地控制参数来源(比如查询字符串参数名和路由参数名存在差异),可以给参数添加[FromRoute]和[FromQuery]特性,允许参数同时从路由或查询字符串获取:
[HttpGet("users/{userId}")] public IActionResult GetUser([FromRoute][FromQuery(Name = "userid")] int userId) { ... }
这种写法下,无论参数是在URL路径里还是查询字符串中,都能正确绑定到userId参数。
内容的提问来源于stack exchange,提问作者Ingmar
相关产品推荐
相关产品推荐

