2013-06-24 67 views
0

如何在ASP.Net Web API的不同控制器上使用相同的方法構建路由?WEB API:不同控制器上的單參數獲取方法

這裏就是我試過:

var config = new HttpSelfHostConfiguration(strUrl); 
      config.Routes.MapHttpRoute(
     "Scripts", "{controller}/{Name}", 
     new { controller = "Scripts",strScriptId=""}); 


      config.Routes.MapHttpRoute(
      "Images", "{controller}/{strParam}", 
      new { controller = "Images", strImageId= "" }); 

感謝。

編輯:在某種意義上是相同的方法。例如,一個方法只接受兩個控制器上名稱不同的參數。

實施例:

  • ScriptsController具有GetScripts(串strScriptId)方法
  • ImagesController具有GetImages(串strImageId)方法。

我需要訪問它像

1. http://localhost/GetScripts/ScriptId123 
2. http://localhost/GetImages/ImageId223 

我無法弄清楚這個路線。我已經嘗試了上述路線(編輯它們使其更清晰)。

我有更多這樣的控制器與不同的getsomething方法接受只有一個參數。

+2

你所說的「不同控制器上的相同方法」是什麼意思? – Liel

+0

請參閱我edits.Thanks – Josh

回答

2

你可以只是一個單一的路線如下圖所示:

config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional}); 

,你可以像下面的操作:

GetImages([FromUri(Name="id")] string strImageId); 

GetScripts([FromUri(Name="id")] string strScriptId); 
+0

非常感謝! – Josh

0

請參閱this tutorial瞭解路由選擇。

對於Id參數它是最簡單的。路由應該是:

config.Routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

和控制方法(它沒有哪個控制器上的事!):

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

如果你真的想串編號,你可以使用它,如下所示:

public MyData Get(string id) 
{ 
    ... 
} 

你真的需要一個不同的參數名嗎?
如果你這樣做,你可以簡單地嘗試以下路由(我不知道,雖然):

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}" 
); 

同時請注意,你寫的路由路徑在概念上是錯誤的,WebApis:
而不是

  1. .../GetScripts/ScriptId123
  2. .../GetImages/ImageId223

考慮以下(GET請求):

  1. ... /腳本/ 123
  2. .../圖片/ 123
+0

不,我知道這一點。我已經使用HttpGet。我需要使用路由URL來接受不同控制器中單個參數的方法。 – Josh

+0

看到我的編輯答案 – Liel

+0

參數的名稱並不總是標識。它可能是ImageId,ScriptId等。他們是字符串。我不知道你的概念是錯的。這是應用程序的需求 – Josh

0

默認路由:

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

應該爲你工作。確保你的動作方法的簽名(使用ID而不是strImageId和strScriptId)

編輯匹配:

@Josh中路由參數應該在你的動作匹配參數。 正如我以前說過的,沒有必要創造替代路線,但如果你需要保持在IDS這些名字,你可以創建一個路由,以適應他們:在航線

routes.MapHttpRoute(
      name: "scriptsRoute", 
      routeTemplate: "{controller}/{strScriptId}", 
      defaults: new { controller="Scripts" } 
     ); 

routes.MapHttpRoute(
      name: "imagesRoute", 
      routeTemplate: "{controller}/{strImageId}", 
      defaults: new { controller="Images" } 
     ); 

注意在ids之上不是可選的,如果需要的話可以添加約束。 另外@liel在命名你的控制器/操作方面的建議是很好的建議。

0

大家都知道REST是基於資源,這個標識資源的URL,使不超過一個方法有相同的參數將在REST服務被允許的,但有工作在MVC 5的Web API方法級左右路由。

這裏是你可以做的是,例如:

[HttpGet] 
[Route("api/search/FindByName/{name}")] 
FindByName(string name) 
{ 
} 

[HttpGet] 
[Route("api/search/FindById/{name}")] 
FindById(int searchId) 

注:「搜索」是控制器的名字。

請讓知道,如果需要進一步澄清。

相關問題