基于 ASP.NET MVC 的多参数路由

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

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

如您所见,传递了多个参数(即 artistapi_key)。在 ASP.NET MVC 中,artistcontrollergetImages是操作,但是如何向操作传递多个参数呢?

使用上面的格式是否可以做到这一点?

336108 次浏览

MVC 直接支持参数,只需在操作方法中添加参数即可:

public ActionResult GetImages(string artistName, string apiKey)

当给定 URL 时,MVC 会自动填充参数,如:

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

另一个特殊情况是名为“ id”的参数。任何名为 ID 的参数都可以放到路径中,而不是查询字符串中,所以类似于:

public ActionResult GetImages(string id, string apiKey)

将正确地填充一个 URL,如下所示:

/Artist/GetImages/cher?apiKey=XXX

此外,如果您有更复杂的场景,您可以自定义 MVC 用于定位动作的路由规则。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
);

以及类似上面第一个示例的方法。

您可以通过查询字符串传递任意参数,但也可以设置自定义路由以 RESTful 方式处理它:

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/

它将把它们带到与您的示例 querystring 相同的位置。

上面只是一个例子,并没有应用业务规则和约束,你必须设置,以确保人们没有“黑客”的网址。

从 MVC 5开始,您还可以使用 Attribute Routing 将 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)