.NET 7 API兼容路由:能否用单方法同时接收路由与查询参数?
解决方案
可以用单个方法同时兼容路由参数和查询参数,不需要创建两个独立方法,以下是两种可行的实现方式:
方式一:给参数同时指定多个绑定源
直接在参数上同时标记[FromRoute]和[FromQuery]属性,ASP.NET Core会按优先级(路由参数优先)尝试绑定参数:
[HttpGet] [Route("string")] [Route("string/{str}")] public string GetString([FromRoute][FromQuery] string str) { return $"abc + {str}"; }
- 调用
/string/123时,路由参数str会被绑定,返回abc + 123 - 调用
/string?str=123时,查询参数str会被绑定,返回abc + 123 - 若两种方式都未传递
str,会返回"The str field is required."的必填错误,符合接口参数校验要求
方式二:拆分参数后手动合并
如果需要更灵活的参数处理逻辑(比如自定义空值判断),可以将路由参数和查询参数分开定义,再在方法内合并取值:
[HttpGet] [Route("string")] [Route("string/{str}")] public string GetString([FromRoute] string? routeStr, [FromQuery] string? queryStr) { var str = routeStr ?? queryStr; if (string.IsNullOrWhiteSpace(str)) { // 自定义参数缺失的处理逻辑,比如返回400 Bad Request throw new ArgumentNullException(nameof(str), "参数str为必填项"); } return $"abc + {str}"; }
这种方式可以自主控制参数的合并规则和空值处理,适合有特殊业务逻辑的场景。
内容的提问来源于stack exchange,提问作者lbarreira
相关产品推荐
相关产品推荐

