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


139

我们公司正在为我们的产品开发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,artist将是controllergetImages在行动,但我会如何将多个参数传递给动作?

使用上述格式甚至可以做到吗?

Answers:


279

只需在操作方法中添加参数,即可在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)

可以使用如下网址正确填充:

/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
我正在使用.NET 4和MVC。我只能在路径中传递一个参数。这个网址{controller} / {action} / {artistName} / {apikey}对我而言不映射到2个参数,而只是触发404错误。据我所知,您只能在路径中传递1个参数。我究竟做错了什么?
DavidHyogo,

1
@DavidHyogo-我遇到了同样的问题。无论出于什么原因,即使我指定了默认操作,我也必须将所需的操作实际放置在html链接中,而不仅仅是控制器和参数。
Shaggy13spe

5
@DavidHyogo:我遇到了同样的问题,并发现您的路由模板参数必须与操作方法参数名称完全匹配,例如,对于定义为{controller} / {action} / {artistName} / {apikey}的路由,操作方法应具有签名公共ActionResult MyMethod(字符串artistName,字符串apikey)
Sudhanshu Mishra

6
另外,请确保您的网址在到达您的自定义网址之前不会被默认路径捕获。它将根据您的定义使用第一个匹配项。就我而言,我尝试使用路由“ MyController / {year} / {month}”作为默认索引,但路由{controller} / {action} / {id}与我的网址(MyController / 2015 / 04),所以我得到了404,因为不存在名称为2015的动作。将我的自定义路线移到顶部可解决此问题。
山姆

routeconfig中的参数名称与我的Action签名不匹配,这就是为什么它不起作用的原因,我按照@dotnetguy描述的步骤进行了工作
pepitomb

26

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


21

您可以通过查询字符串传递任意参数,但也可以设置自定义路由以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/

将它们带到示例查询字符串所做的相同位置。

上面仅是一个示例,并未应用您必须设置的业务规则和约束来确保人们不会“入侵” URL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.