2013-10-30 32 views
0

我想看看我是否需要寫一個自定義IHttpRouteConstraint或如果我可以與內置的摔跤得到我想要的是。我無法在任何地方找到任何有用的文檔。創建一個路徑,可以接受一個日期時間的URI與asp.net web api 2屬性路由

基本上,這是我的行動:

[Route("var/{varId:int:min(1)}/slot/{*slot:datetime}")] 
public async Task<HttpResponseMessage> Put(int varId, DateTime slot) 
{ 
    ... 
} 

我要的是能夠調用它是這樣的: PUT /api/data/var/1/slot/2012/01/01/131516,並有框架綁定19 VAR ID,並與揚的」值的DateTime 2012年1月15日下午1:15:16「作爲」插槽「值。

繼從這裏指南:http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing我能得到它通過傳遞,在短短的日期段,即PUT /api/data/var/1/slot/2012/01/01PUT /api/data/var/1/slot/2012-01-01工作,但只給了我一個數據值,沒有時間的部件。

有些東西告訴我,試圖通過URI段以任何理智的方式及時傳遞是一個壞主意,但我不確定爲什麼它會是一個壞主意,除了關於本地vs UTC時間的歧義之外。

我也嘗試用正則表達式約束datetime約束,例如, {slot:datetime:regex(\\d{4}/\\d{2}/\\d{2})/\\d{4})}試圖讓它解析類似2013/01/01/151617作爲日期時間,但無濟於事。

我敢肯定我能得到這個帶有自定義IHttpRouteConstraint工作,我只是不想做的事,可能是內置的。

謝謝!

回答

3

Web API日期時間約束對於解析日期時間沒有做任何特殊的事情,您可以在下面注意到(源代碼here)。 如果您的請求的url像var/1/slot/2012-01-01 1:45:30 PMvar/1/slot/2012/01/01 1:45:30 PM,它似乎好工作......但我想,如果你需要充分的靈活性然後創建一個自定義的約束是最好的選擇...

public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) 
{ 
    if (parameterName == null) 
    { 
     throw Error.ArgumentNull("parameterName"); 
    } 

    if (values == null) 
    { 
     throw Error.ArgumentNull("values"); 
    } 

    object value; 
    if (values.TryGetValue(parameterName, out value) && value != null) 
    { 
     if (value is DateTime) 
     { 
      return true; 
     } 

     DateTime result; 
     string valueString = Convert.ToString(value, CultureInfo.InvariantCulture); 
     return DateTime.TryParse(valueString, CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 
    } 
    return false; 
} 
+0

謝謝!我最終爲此創造了自己的約束。結果非常簡單。 –

+0

由於codeplex關閉,看起來源代碼鏈接即將死亡。似乎這已經克隆在Github [這裏](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/Common/Routing/Constraints/DateTimeRouteConstraint.cs) –

2

的選擇是傳遞日期時間作爲查詢字符串參數(見[FromUri]

例如

[Route("api/Customer/{customerId}/Calls/")] 
public List<CallDto> GetCalls(int customerId, [FromUri]DateTime start, [FromUri]DateTime end) 

這將具有

簽名0
GET api/Customer/{customerId}/Calls?start={start}&end={end} 

startDate.ToString("s", CultureInfo.InvariantCulture); 

查詢字符串創建查詢字符串日期看起來像

api/Customer/81/Calls?start=2014-07-25T00:00:00&end=2014-07-26T00:00:00 
+0

'startDate.ToString( 「s」,CultureInfo.InvariantCulture);'代碼中有什麼? –

+0

僅供將來參考,「s」會指定將日期格式化爲可排序模式,請參閱:[Microsoft Docs](https://docs.microsoft.com/zh-cn/library/ms14.aspx)。COM/EN-US/DOTNET /標準/基本型/標準日期和時間格式字符串#可排序) – Pantelis