多个可选参数 web api 属性路由

Multiple optional parameters web api attribute routing

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

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

[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 标记为可选。

使用查询字符串。

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

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

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

{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 值路由时 table 不知道你指的是哪个可选参数,因此 404