如何使用Web API属性路由传递DateTime参数?

Geo*_*ges 6 asp.net routing datetime asp.net-web-api

我正在使用ASP.NET Web API 2开发REST API.当我尝试将日期集成到游戏中时,这会变得很糟糕.

这是路线:

[Route("{id:Guid}/{from:DateTime}/{to:DateTime}")]
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我可以完美地传递类似的东西

.../[id]/2012-01-01/2013-01-01
Run Code Online (Sandbox Code Playgroud)

然而,当我到达需要时间信息的地步时,它变得非常糟糕,让我们想象一下:

.../[id]/2012-01-01/2013-01-01 1:45:30 PM/2013-01-01 1:45:30 PM
Run Code Online (Sandbox Code Playgroud)

似乎空间正常,但":"正在阻塞.所以我虽然应该使用我自己的格式,因为yyyyMMddhhmm.这给出了以下URL:

.../[id]/201301031147/201401031147
Run Code Online (Sandbox Code Playgroud)

但是,.NET并不期望这是一个DateTime,也不知道如何使用它.所以我使用IHttpRouteConstraint来允许它.问题是,在我告诉它没关系后,它仍然不知道如何处理它...

所以我的问题是,你如何将DateTime传递给路线?

Geo*_*Cox 4

问题在于 : 是路径中 URL 保留字符。MVC 不希望它被 URL 编码并且不会处理它。但是,它不保留在查询字符串中

将其从路由规范中删除,但将它们保留为方法中的参数,模型绑定器将绑定它们。或者,您也可以将它们作为参数删除,并通过 Context 查询字符串属性或 ControllerContext.Request.GetQueryNameValuePairs() 访问它们。

所以你会有 ?fromDate=2012-01-01T1:45:30PM&toDate=2013-01-01T1:45:30PM