2012-06-26 126 views
1

我需要地圖創建控制器什麼是必須應對兩個URL:類似路由映射

  1. 的「http://本地主機/ API /控制器ID = 1」(其中僅值ID可以改變)
  2. 的 「http://本地主機/ API /控制器/ anotherId/someconst」(其中anotherId是唯一一個變化部分)

我將其映射到這樣的路由:

routes.MapHttpRoute("Test", "api/{controller}/{id}/{someconst}", new { controller = "Test", someconst = RouteParameter.Optional }); 

而且必須在我的控制器方法:

public void Get(int id) { ... } 
public void Get(int anotherId, string someconst) { ... } 

它的工作原理......不過,這並不好看......導致「串someconst」是不是設置了一個param,它的URL的只是一個常量的一部分。但是,如果我刪除「字符串someconst」參數第二個網址將無法正常工作。 是否有可能將一個控制器映射到兩個路徑來解析這個url,使其清晰無誤地假設這是一個常量?

+1

你的意思是說你想在控制器上做另一個動作嗎?你可以說「api/{controller}/{id}/{action}」,然後代替調用它「public void Get(int anotherId,string someconst)」,你可以把它叫做「public void GetSomeConst(int anotherId)」。只要確保你設置了你的默認行動 – parKing

+0

我完全不理解你,但認爲你是對的...我找到了同樣的解決方案...謝謝 –

回答

1

嗯,我得到了答案......只是有路線...

routes.MapHttpRoute("Test", "api/{controller}/{id}", new { controller = "Test", action = "Get", id= @"\d+");); 

routes.MapHttpRoute("TestSomeConst", "api/{controller}/{anotherId}/someconst", new { controller = "Test", action = "GetSomeconst", anotherId= @"\d+"); 

和更改控制器方法(行動):

public void Get(int id) { ... } 
public void GetSomeconst(int anotherId) { ... } 
+0

移動到答案,我可以更好地解釋。 – parKing

0

有一件事你可以嘗試做是映射這樣的路線:

routes.MapHttpRoute("Test", "api/{controller}/{id}/{action}", new { controller = "Test", action = "Get", id= @"\d+"}); 

,使您的操作:

public void Get(int id) { ... } 

[HttpGet] 
public void Someconst(int id) { ... } 

因爲你的行動默認爲「獲取」的方法,你可以忽略,並稱之爲:

http://localhost/api/test/1 

如果你想打電話給你的另一種方法,你可以使用

http://localhost/api/test/1/someconst 
+0

你確定這會行嗎?我完全複製你的代碼,它不......只是第一個方法被解僱 –

+0

我改變了一下代碼,我運行了一個簡單的測試應用程序和更新的代碼。我對控制器/動作命名如何工作有點困惑。出於某種原因,我認爲你不需要在請求中明確getomeconst端點的「get」,但你確實需要。與「[HttpGet]」屬性,你不必。 – parKing