首页 > 解决方案 > 带有 int 和 string 的 ASP.net Web API 属性路由

问题描述

这应该是一个快速的。我有两条路线:

[HttpGet]
[Route("{id}")]
[ResponseType(typeof(Catalogue))]
public IHttpActionResult Get(string id) => Ok(_catalogueService.Get(id));

[HttpGet]
[Route("{numberOfResults:int}")]
[ResponseType(typeof(IEnumerable<Catalogue>))]
public IHttpActionResult List(bool active, int numberOfResults) => Ok(_catalogueService.List(active, numberOfResults));

当我使用邮递员尝试列出我的目录时,我传递了类似这样的内容

/目录/10

我希望它能够List采用我的控制器中的方法。同样,如果我想获取目录,我会传递这样的内容:

/目录/AB100

我的路线工作正常,但我最近对方法进行了更改List(我添加了活动布尔),现在我的路线无法正常工作。我上面给出的两个例子都Get被错误的方法捕获了。

有没有办法解决这个问题?

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

解决方案


添加一个默认值active并将其numberOfResults作为可选参数放在参数之后。

[HttpGet]
[Route("{numberOfResults:int}")]
[ResponseType(typeof(IEnumerable<Catalogue>))]
public IHttpActionResult List(int numberOfResults, bool active = true) => //assuming active default
    Ok(_catalogueService.List(active, numberOfResults));

由于额外的必需 active参数,默认情况下它将不再匹配原始重载路由,因为active即使不在路由模板中,它也会期望成为 URL 的一部分。

喜欢

/catalogues/10?active=true

通过使该参数成为可选参数,这意味着它现在可以像以前一样将预期的行为与active从 URL 中省略时提供给操作的值相匹配


推荐阅读