2012-07-17 143 views
2

我的工作我的第一個Web API和我被困在試圖爲這些URL路由可選參數

1) http://mydomain.com/values/4 --> this number can be any, this is just an example 
2) http://mydomain.com/values/ 
3) http://mydomain.com/values/?param1=test1&param2=test2 
4) http://mydomain.com/values/?param1=test1 
5) http://mydomain.com/values/?param2=test2 

我當前的路由規則

routes.MapHttpRoute(
    name: "Route1", 
    routeTemplate: "{controller}/{id}/" 
); 
routes.MapHttpRoute(
    name: "Route2", 
    routeTemplate: "{controller}/{param1}/{param2}", 
    defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional } 
); 

創建規則和我的方法服務這些URL

// GET values/ 
// GET values/?param1=test1&param2=test2 
// GET values/?param1=test1 
// GET values/?param2=test2 
public IEnumerable Get(string param1, string param2) 
{ 
    return new string[] { "value1", "value2" }; 
} 

// GET values/5 
public string Get(int id) 
{ 
    return "value"; 
} 

我有2個問題

1)http://mydomain.com/values/是不解析

2)http://mydomain.com/values/?param1=test1http://mydomain.com/values/?param2=test2沒有解決。

你能幫我創造服務這些網址的路線?

回答

4
routes.MapHttpRoute(
    name: "Route1", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

應該做你所需要的。查詢字符串參數已被映射到Action參數,只要它們的命名相同,無需將其添加到路由中。

+0

謝謝,這是完美的工作。唯一的問題是,我想保持分開的方法,因爲我在我的問題上說過。如果我有一個單一的方法簽名'公共IEnumerable的獲取(INT?ID,字符串參數1,字符串參數2)' – StackOverflower 2012-07-17 19:47:50

+0

您可以獲取(INT?編號),獲得(INT?ID,字符串參數1)或任意組合,路由沒有禁止這一點。 – Maess 2012-07-17 20:09:34

+0

我會喜歡爲我的列表中的Get(int?id)'(對於我的列表中的url 1),'Get(string param1,string param2)'(其餘部分)。 – StackOverflower 2012-07-17 21:51:42

2

首先,你不需要路線

routes.MapHttpRoute(
    name: "Route2", 
    routeTemplate: "{controller}/{param1}/{param2}", 
    defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional } 
); 

其次解決http://mydomain.com/values/您需要的參數id可選的通過使int?

// GET values/5 
public string Get(int? id) 
{ 
    return "value"; 
} 
+0

對不起@Asif,但這是錯誤的。如果你這樣做,那麼路線{id}必須設置爲可選。其次,如果你只使用?param2 = ...調用url,你不會用兩個參數來觸發重載。 – stevethethread 2012-07-17 17:40:49

+0

如果你不希望id是可選的,那麼http://mydomain.com/values/將如何解析而不用id。第二個參數2被名稱識別,對於不需要定義路由的查詢字符串。 – 2012-07-17 17:44:28

+0

試試看看。如果您未將{id}設爲可選,則mydomain.com/values將無法使用。 – stevethethread 2012-07-17 17:48:32