【问题标题】:Multiple optional parameters web api attribute routing多个可选参数 web api 属性路由
【发布时间】:2017-06-26 04:11:31
【问题描述】:

我是属性路由的新手,我不确定这是否可能。

我有一个属性路由,它可以像这样正常工作:

[HttpGet]
[Route("GetIssuesByFlag/{flag:int=3}")]
public IEnumerable<IssueDto> GetIssuesByFlag(int flag)

现在我想添加一些额外的可选参数来缩小搜索范围,所以我想添加 2 个额外的可选参数。

我尝试过的:

[HttpGet]
[Route("GetIssuesByFlag/{flag:int=3?}/{categoryId:int?}/{tagIds?}")]
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , int? categoryId = null, int?[] tagIds = null)

如果我的呼叫是 /api/controller/1/2,这可以正常工作,但是当涉及到 /api/controller/1 时会出现 404 失败。

我怎样才能做到这一点?

编辑 1:下面 Nkosi 的回答有效,但需要进行额外修改。

[HttpGet]
[Route("GetIssuesByFlag/{flag:int=3}/{tagIds?}/{categoryId:int?}")]
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , List<int> tagIds, int? categoryId = null )

列表或数组必须是第二个,因为如果没有提供值,它会自动为 null,并且不能用 = null 标记为可选。

【问题讨论】:

  • {flag:int=3?} 是问题所在。它是可选的{flag:int?},在操作中具有默认值,或者是{flag:int=3}。您目前有 3 个可选参数。当您只有 1 值路由表时不会知道您指的是哪个可选参数,因此 404
  • Nikosi 的回答对我有用!好吧,第一个不是分裂的,已经删除了现在一切正常
  • 第一个(从标志中删除可选)你能在答案上更新它,以便我可以标记为正确吗?

标签: c# asp.net asp.net-web-api asp.net-web-api-routing attributerouting


【解决方案1】:

使用查询字符串。

[HttpGet]
    [Route("GetIssuesByFlag/{flag:int=3?}")]
    public IEnumerable<IssueDto> GetIssuesByFlag(int flag, List<int> tagIds, int? categoryId = null)

网址:/getissuesbyflag/1?tagIds=2,5,6&categoryId=56

如果需要,您确实应该对可选参数和路径参数使用查询字符串。

【讨论】:

  • 如果我提供所有变量,它会再次工作,但如果我只提供标志,它会失败并显示“消息”:“没有找到与请求 URI 'localhost:44363/api/Issues/GetIssuesByFlag/1' 匹配的 HTTP 资源。”,“messageDetail ": "在控制器'问题'上找不到与请求匹配的操作。"
【解决方案2】:

{flag:int=3?} 是问题所在。它是可选的{flag:int?},在操作中具有默认值,或者是{flag:int=3}

[HttpGet]
Route("GetIssuesByFlag/{flag:int=3}/{categoryId:int?}/{tagIds?}")]
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , int? categoryId = null, int?[] tagIds = null)

您目前有 3 个可选参数。当您只有 1 值路由表时不会知道您指的是哪个可选参数,因此 404

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 2014-04-18
    • 2017-07-14
    • 2014-10-18
    • 1970-01-01
    • 2017-03-17
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多