如何修复我的 MVC3 路由

本文关键字:路由 MVC3 我的 何修复 | 更新日期: 2023-09-27 18:37:11

我在 ASP.NET MVC3应用程序中遇到一些路由问题,确切地说它不能按我想要的方式工作。

Global.asax 中的路由定义

routes.MapRoute(
            "News", // Route name
            "{lang}/{controller}/{action}/{page}/{id}", // URL with parameters
            new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults
        );

所以我想在 2 种情况下使用它:

  1. /{lang}/{controller}/{action}/{page} - 转到特定分页的页面
  2. /{lang}/{controller}/{action}/{page}/{id} - 记住当前页面,然后转到具有特定id的页面。

生成我使用的链接

@Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i })

其中i是页数,lang是语言。

控制器中,我处理它女巫操作

public ViewResult Index(string lang, int page = 1)

问题

@Html.RouteLink给了我链接/pl/News/Index/2(单击"2"时),但我的控制器无法处理它,页面仍然是"1"。因此,当我单击同一链接两次时,它会给出:/pl/News/Index/2/2然后页面等于"2"。

如果有人可以解释它是如何工作的,我能做些什么来解决它?

任何帮助将不胜感激。

如何修复我的 MVC3 路由

我想您在这里缺少的是路由系统使用当前请求中的变量值来生成出站规则。

例如 - 如果你在页面/pl/News/Index/2 你有

lang = "pl", controller = "News", action = "Index", page = 2

如果您尝试生成这样的规则

@Html.RouteLink(i.ToString(), "News")

路由系统将使用已经存在的变量,如langpage,并将生成完全相同的URL -/pl/News/Index/2。

当然,在 Html.RouteLink 中以匿名类型传递的值将按优先级处理,并将覆盖当前请求中的值。因此,在您的示例中,您应该考虑在生成链接时您位于哪个 URL

优先顺序为:

  1. 在匿名类型中传递的变量
  2. 请求变量
  3. 路由中定义的默认值。

似乎这部分

lang = ViewBag.Lang

是无用的,因为如果您不提供 lang,它将从请求中获取 - 因此它将被保留。

更新(可能不相关):

您还应该记住,如果一个规则有多个匹配项 - 路由系统将选择第一个满足约束的规则(例如,请求中的值不应与默认变量冲突)

更新2

路由系统使用请求变量直到第一个显式指定的变量(通过匿名类型),因此如果您显式指定 lang - 不会重用任何请求变量(在您的情况下,因为 lang 是 url 中的第一个段)

我认为您的部分问题在于您有点打破惯例,并且由于 MVC 依赖于约定来成功路由,因此您的映射有点破坏。

我建议像这样重写您的路由:

routes.MapRoute(
            "News", // Route name
            "{controller}/{action}/{lang}/{id}/{page}", // URL with parameters
            new { controller = "News", action = "Index", lang = "pl", page = 1, id = UrlParameter.Optional } // Parameter defaults
        );

似乎 URL 最常见的情况是:

http://yourdomainhere/news/pl/some-sort-of-permalink/1