使用Http.RouteAttribute路由可选参数

时间:2018-12-03 10:26:17

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

我有一个带有两个必需参数和一些可选参数的动作:

[HttpGet]
public IHttpActionResult GetUsers(DateTime dateFrom, DateTime dateTo, string zipcode, int? countryId)
{
    using (DataHandler handler = new DataHandler())
        return Ok(handler.GetUsers(dateFrom, dateTo).ToList());
}

我想要一个这样的网址:

/api/getusers/2018-12-03T07:30/2018-12-03T12:45?zipcode=4002&countryId=4

zipcodecountryId是可选的,将与?-thingy一起添加。所需的参数dateFromdateTo将与/

一起添加

因此以下网址也应该可行:

/api/getusers/2018-12-03T07:30/2018-12-03T12:45?countryId=4
/api/getusers/2018-12-03T07:30/2018-12-03T12:45?zipcode=4002
/api/getusers/2018-12-03T07:30/2018-12-03T12:45

我尝试了一些类似的路由

[Route("getusers/{dateFrom}/{dateTo}")]
[Route("getusers/{dateFrom}/{dateTo}*")]
[Route("getusers/{dateFrom}/{dateTo}**")]
[Route("getusers/{dateFrom}/{dateTo}?zipcode={zipcode}&countryId={countryId}")]

,但是它们都不起作用。 当我删除可选参数时,它可以工作,但是我需要那些可选参数。

有什么想法要完成吗?

1 个答案:

答案 0 :(得分:3)

在操作方法中使可选参数为可选

  

如果route参数是可选的,则必须为method参数定义一个默认值。

//GET /api/getusers/2018-12-03T07:30/2018-12-03T12:45?countryId=4
//GET /api/getusers/2018-12-03T07:30/2018-12-03T12:45?zipcode=4002
//GET /api/getusers/2018-12-03T07:30/2018-12-03T12:45
[HttpGet]
[Route("getusers/{dateFrom:datetime}/{dateTo:datetime}")]
public IHttpActionResult GetUsers(DateTime dateFrom, DateTime dateTo, string zipcode = null, int? countryId = null) {
    using (DataHandler handler = new DataHandler())
        return Ok(handler.GetUsers(dateFrom, dateTo).ToList());
}

引用Attribute Routing in ASP.NET Web API 2