.Net 5.0 接口配置多特性路由后查询参数id始终为0如何解决
问题产生原因
- ASP.NET Core Web API 对于简单类型参数的默认绑定优先级为:路由路径参数 > 查询字符串参数。如果参数名称已在路由模板中显式声明,框架会优先尝试从路由路径提取该参数的值,不会主动 fallback 到查询字符串读取。
- 你当前配置的两个路由模板
"Get/{id?}"和"{id}"都将id定义为路径参数,当请求api/Controller/Get?id=1时,匹配到Get/{id?}路由,此时路径中未传入id片段,框架从路由路径取值失败,直接给值类型long返回默认值0,忽略查询字符串中携带的id参数。
修复方案
以下两种方案均可兼容原有路径传参的使用方式,同时支持查询字符串传参:
方案1:显式指定参数支持多绑定源
给id参数同时添加[FromRoute]和[FromQuery]特性,明确告诉框架可以从路由路径和查询字符串两个位置读取参数值:
[HttpGet, Route("Get/{id?}"), Route("{id}")] public void Get([FromRoute][FromQuery] long id) { // 业务逻辑 }
方案2:新增无路径id参数的路由模板
新增一个不包含id路径参数的路由模板,匹配查询参数传参的请求场景:
[HttpGet] [Route("Get/{id?}")] [Route("{id}")] [Route("Get")] // 新增无路径id参数的路由 public void Get(long id) { // 业务逻辑 }
当请求命中新增的Get路由时,路由模板中无id参数定义,框架会自动从查询字符串读取id的值。
内容的提问来源于stack exchange,提问作者G Ali
相关产品推荐
相关产品推荐

