使用ASP.NET MVC与多个参数进行路由

我们公司正在为我们的产品开发一个API,我们正在考虑使用ASP.NET MVC。 在devise我们的API时,我们决定使用下面的调用来让用户以XML格式请求API的信息:

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

正如你所看到的,传递了多个参数(即artistapi_key )。 在ASP.NET MVC中, artist将是controllergetImages这个动作,但是如何将多个parameter passing给动作呢?

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

通过简单地将参数添加到您的操作方法中,直接支持参数。 给出如下的操作:

 public ActionResult GetImages(string artistName, string apiKey) 

当给定一个URL时,MVC将自动填充参数:

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

另一个特例是名为“id”的参数。 任何名为ID的参数都可以放在path中,而不是查询string,如下所示:

 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 ); 

和上面的第一个例子一样。

您可以通过查询string传递任意参数,但您也可以设置自定义路由以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/cherhttp://img.dovov.comb25b959554ed76058ac220b7b2e0a026/ 

这将把他们到你的示例查询string所做的相同的地方。

以上只是一个示例,并不适用您必须设置的业务规则和限制,以确保人们不会“破解”url。

从MVC 5开始,您还可以使用“属性路由”将URL参数configuration移动到您的控制器。

有关详细的讨论,请访问: 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(); } } 

然后,您可以使用属性来定义参数和可选的数据types

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