首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ASP.NET MVC实现多参数路由

使用ASP.NET MVC实现多参数路由
EN

Stack Overflow用户
提问于 2010-02-12 01:59:51
回答 3查看 318.3K关注 0票数 145

我们公司正在为我们的产品开发一个应用程序接口,我们正在考虑使用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是动作,但是我如何向动作传递多个参数呢?

使用上面的格式这是可能的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-12 02:03:20

只需将参数添加到您的操作方法上,就可以在MVC中直接支持参数。给定一个类似以下内容的操作:

代码语言:javascript
复制
public ActionResult GetImages(string artistName, string apiKey)

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

代码语言:javascript
复制
/Artist/GetImages/?artistName=cher&apiKey=XXX

另一个特殊情况是名为"id“的参数。任何名为ID的参数都可以放入路径中,而不是放入querystring中,因此如下所示:

代码语言:javascript
复制
public ActionResult GetImages(string id, string apiKey)

将使用如下所示的URL正确填充:

代码语言:javascript
复制
/Artist/GetImages/cher?apiKey=XXX

此外,如果您有更复杂的方案,则可以自定义MVC用来定位操作的路由规则。您的global.asax文件包含可以自定义的路由规则。默认情况下,规则如下所示:

代码语言:javascript
复制
routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

如果您想要支持像这样的url

代码语言:javascript
复制
/Artist/GetImages/cher/api-key

您可以添加如下所示的路由:

代码语言:javascript
复制
routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

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

票数 289
EN

Stack Overflow用户

发布于 2016-01-28 18:15:18

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

详细的讨论可以在这里找到:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

摘要:

首先,启用属性路由

代码语言:javascript
复制
 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

然后,可以使用属性来定义参数和数据类型(可选

代码语言:javascript
复制
public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)
票数 28
EN

Stack Overflow用户

发布于 2010-02-12 02:10:51

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

代码语言:javascript
复制
http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

这可能是:

代码语言:javascript
复制
routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

因此,如果有人使用以下路由:

代码语言:javascript
复制
ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

这将把它们带到与您的示例查询字符串相同的位置。

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

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2246481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档