【问题标题】:MVC3 Routes with Different Parameter Types具有不同参数类型的 MVC3 路由
【发布时间】:2013-03-14 09:52:07
【问题描述】:

我正在努力理解 MVC3 中的路由。

以前我通常只是避开整个区域并坚持使用丑陋的旧 ?id=1&foo=bar 类型网址。不好看。

这样定义了 4 条路线

routes.MapRoute("Blog", "{controller}/{action}/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional });
routes.MapRoute("Code", "{controller}/{action}/{title}", new { });
routes.MapRoute("Id", "{controller}/{action}/{id}", new { });
routes.MapRoute("Default", "{controller}/{action}", new { controller = "home", action = "index" });

我已尝试从最具体到最不具体的顺序排列它们。

第一个“博客”路由运行良好,我可以使用像 /blog/list/2/5 这样的 URL,它可以正确映射到我的控制器。

底部的默认路由也可以正常工作。

但是,如果我有这样的操作方法:

public ActionResult BarX(int id)
{
    //some stuff
}

public ActionResult BarY(string title)
{
    //some stuff
}

我希望它使用第三条路由并生成像 /foo/barX/3 这样的 URL。

如果我使用

@Html.ActionLink("TEST1", "barX", "foo", new { id = 3 }, null)

生成的网址是

/foo/barx?id=3

同样是为

生成的 URL
@Html.ActionLink("TEST2", "barY", "foo", new { title = "test" }, null)

/foo/bary?title=test

所以我想我的问题是:为什么他们使用旧的 ?id= 语法而不是 /foo/barx/3 生成 URL?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 routes asp.net-mvc-routing


    【解决方案1】:

    您的所有路线基本相同。他们是

    {controller}/{action}/{param}/{param}
    

    我这么说是因为路由引擎无法理解{controller}/{action}/{id}{controller}/{action}/{title} 之间的区别

    路由引擎真的会看到

    {controller}/{action}/{PageNumber}/{PostsPerPage}
    

    并将所有路线与第一条路线混淆。


    一旦路由引擎在顶部看到您几乎通用的 {optional}/{optional}/{optional}/{optional}/ 路由,任何包含 4 个或更少元素的东西都可以适应它,所以它不会再往前走了。


    另一方面,如果您的路线有独特的起点,而不是通用的{Controller}

    routes.MapRoute("Blog", "Blog/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional });
    routes.MapRoute("Code", "Code/{title}", new { controller = "code", action = "list", title = UrlParameter.Optional });
    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = UrlParameter.Optional });
    

    现在,每次路由引擎看到Blog/... 时,它都知道只有 1 个路由可以匹配。与所有其他人一起,它将继续寻找匹配项。每当它看到Code/... 时,再次只有一条路由是匹配的。 Default 会处理像 {Controller}/{Action}/{id} 这样没有 BlogCode 作为第一路由参数的东西。

    【讨论】:

    • "你所有的路线基本都一样。" +1 - 钉在头上。
    猜你喜欢
    • 2015-08-18
    • 2011-09-23
    • 1970-01-01
    • 2020-02-01
    • 2011-10-06
    • 2017-10-10
    • 2019-10-26
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多