我們公司正在爲我們的產品開發一個API,我們正在考慮使用ASP.NET MVC。在設計我們的API,我們決定採用類似下面呼籲用戶從API以XML格式請求信息:使用ASP.NET MVC的多參數路由
正如你可以看到,多個參數傳遞(即artist
和api_key
)。在ASP.NET MVC中,artist
將是controller
,getImages
的操作,但是如何將多個參數傳遞給該操作?
這甚至可以使用上面的格式?
我們公司正在爲我們的產品開發一個API,我們正在考慮使用ASP.NET MVC。在設計我們的API,我們決定採用類似下面呼籲用戶從API以XML格式請求信息:使用ASP.NET MVC的多參數路由
正如你可以看到,多個參數傳遞(即artist
和api_key
)。在ASP.NET MVC中,artist
將是controller
,getImages
的操作,但是如何將多個參數傳遞給該操作?
這甚至可以使用上面的格式?
只需將參數添加到您的操作方法中,即可在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
);
,並像第一種方法上面的例子。
您可以通過查詢字符串傳遞任意參數,但您也可以設置自定義的路由來處理它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/
它會把他們帶到同一個地方你的實例電子查詢字符串的確如此。
以上只是一個示例,並不適用您必須設置的業務規則和約束,以確保人們不會「破解」網址。
從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)
ASP.NET Core MVC中的屬性路由參見https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing#attribute-routing – 2017-01-11 08:52:45
我正在使用.N ET 4和MVC。我只能在路徑中傳遞一個參數。此URL {controller}/{action}/{artistName}/{apikey}不會映射到2個參數,而只是觸發404錯誤。據我所知,你只能在路徑中傳遞1個參數。我究竟做錯了什麼? – DavidHyogo 2013-02-12 14:22:06
@DavidHyogo - 我遇到了同樣的問題。無論出於何種原因,即使我指定了默認動作,我也必須將我想要的動作放到我的html鏈接中,而不僅僅是控制器和參數。 – Shaggy13spe 2013-02-24 18:26:32
@DavidHyogo:我遇到同樣的問題,並發現您的路由模板參數必須與操作方法參數名稱完全匹配,例如對於定義爲{controller}/{action}/{artistName}/{apikey}的路由,該操作方法應該具有公共ActionResult MyMethod(string artistName,string apikey) – dotnetguy 2013-06-26 06:52:03