使用 Http.RouteAttribute 路由可选参数

Posted

技术标签:

【中文标题】使用 Http.RouteAttribute 路由可选参数【英文标题】:Routing optional parameters with Http.RouteAttribute 【发布时间】:2019-05-04 15:07:30 【问题描述】:

我有一个包含两个必需参数和几个可选参数的操作:

[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】:

在action方法中使可选参数可选

如果路由参数是可选的,则必须为方法参数定义一个默认值。

//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

【讨论】:

以上是关于使用 Http.RouteAttribute 路由可选参数的主要内容,如果未能解决你的问题,请参考以下文章

对于某些方法,基于属性的webapi2路由返回404

某些路由是不是可以使用 vue 路由器而其他路由使用 laravel 路由器?

使用属性路由时是不是可以更改路由表中的路由顺序?

使用动态路由协议

使用动态路由协议

Vue路由的使用