2010-02-11 141 views
109

我們公司正在爲我們的產品開發一個API,我們正在考慮使用ASP.NET MVC。在設計我們的API,我們決定採用類似下面呼籲用戶從API以XML格式請求信息:使用ASP.NET MVC的多參數路由

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

正如你可以看到,多個參數傳遞(即artistapi_key )。在ASP.NET MVC中,artist將是controller,getImages的操作,但是如何將多個參數傳遞給該操作?

這甚至可以使用上面的格式?

回答

239

只需將參數添加到您的操作方法中,即可在MVC中直接支持參數。鑑於類似下面的操作:

public ActionResult GetImages(string artistName, string apiKey) 

MVC將獲得一個網址就像當自動填充的參數:

/Artist/GetImages/?artistName=cher&apiKey=XXX 

一個額外的特殊情況,是一個名爲「ID」的參數。任何參數命名的ID可投入的路徑,而不是查詢字符串,所以像:

public ActionResult GetImages(string id, string apiKey) 

會正確使用類似下面的URL來填充:

/Artist/GetImages/cher?apiKey=XXX 

此外,如果你有更復雜的情況下,您可以自定義MVC用來查找操作的路由規則。您的global.asax文件包含可自定義的路由規則。默認情況下,規則是這樣的:

routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

如果你想支持像

/Artist/GetImages/cher/api-key 

一個網址,你可以添加喜歡的路線:

routes.MapRoute(
      "ArtistImages",            // Route name 
      "{controller}/{action}/{artistName}/{apikey}",       // URL with parameters 
      new { controller = "Home", action = "Index", artistName = "", apikey = "" } // Parameter defaults 
     ); 

,並像第一種方法上面的例子。

+1

我正在使用.N ET 4和MVC。我只能在路徑中傳遞一個參數。此URL {controller}/{action}/{artistName}/{apikey}不會映射到2個參數,而只是觸發404錯誤。據我所知,你只能在路徑中傳遞1個參數。我究竟做錯了什麼? – DavidHyogo 2013-02-12 14:22:06

+1

@DavidHyogo - 我遇到了同樣的問題。無論出於何種原因,即使我指定了默認動作,我也必須將我想要的動作放到我的html鏈接中,而不僅僅是控制器和參數。 – Shaggy13spe 2013-02-24 18:26:32

+5

@DavidHyogo:我遇到同樣的問題,並發現您的路由模板參數必須與操作方法參數名稱完全匹配,例如對於定義爲{controller}/{action}/{artistName}/{apikey}的路由,該操作方法應該具有公共ActionResult MyMethod(string artistName,string apikey) – dotnetguy 2013-06-26 06:52:03

18

您可以通過查詢字符串傳遞任意參數,但您也可以設置自定義的路由來處理它REST方式:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher& 
            api_key=b25b959554ed76058ac220b7b2e0a026 

這可能是:

routes.MapRoute(
    "ArtistsImages", 
    "{ws}/artists/{artist}/{action}/{*apikey}", 
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" } 
    ); 

所以,如果有人使用以下路線:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/ 

它會把他們帶到同一個地方你的實例電子查詢字符串的確如此。

以上只是一個示例,並不適用您必須設置的業務規則和約束,以確保人們不會「破解」網址。

15

從MVC 5開始,您還可以使用屬性路由將URL參數配置移動到您的控制器。

的詳細討論,請訪問: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

摘要:

首先,你能屬性路由

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapMvcAttributeRoutes(); 
    } 
} 

然後你可以使用屬性來定義的參數和可選的數據類型

public class BooksController : Controller 
{ 
    // eg: /books 
    // eg: /books/1430210079 
    [Route("books/{isbn?}")] 
    public ActionResult View(string isbn) 
+2

ASP.NET Core MVC中的屬性路由參見https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing#attribute-routing – 2017-01-11 08:52:45