【问题标题】:How to fix my MVC3 routing如何修复我的 MVC3 路由
【发布时间】:2012-06-16 02:35:23
【问题描述】:

我的 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
        );

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

  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 是语言。

Controller 中,我通过 Action 处理它:

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

问题

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 那是一条邪恶的路线,但我在你的控制器中没有看到id(这是可选的),不应该是Index(string lang, int? id, int page = 1)吗? :)
  • 你没有仔细阅读:) 在索引操作中我不使用id参数,我只在其他操作上需要它。
  • 如果我理解正确的话,你点击/pl/News/Index/2,它会触发正确的Index动作,但是这个动作中page的值是1而不是2。难道没有其他路线可以匹配这个链接吗?
  • 我想如果我使用@Html.RouteLink 并给出路线名称,它应该采用特定的。但如果 url 不适合规则......它采用默认值。嗯,我认为这是重点,但我不知道为什么会发生以及如何改变它。

标签: c# asp.net-mvc-3 routing global-asax


【解决方案1】:

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

例如 - 如果您在 /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 中以匿名类型传递的值会被优先处理,并将覆盖当前请求中的值。因此,在您的示例中,您应该考虑生成链接时您的网址是什么

优先顺序为:

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

好像是这部分

lang = ViewBag.Lang

没用,因为如果您不提供 lang,它将从请求中获取 - 所以它会被保留。

更新(可能不相关):

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

更新2

路由系统使用请求变量直到第一个明确指定的变量(通过匿名类型),所以如果你明确指定 lang - 没有请求变量将被重用(在你的情况下,因为 lang 是您网址中的第一段)

【讨论】:

  • 感谢您的回答,但我不确定我是否理解您的意思。你建议我改变某事吗?另外,当我使用@Html.RouteLink 并给出特定的路线名称时,它采用了正确的规则,不是吗?但我看到它不会覆盖page 值。但是我必须做什么,它会这样做吗?
  • @MateuszRogulski - 是的,当您使用 RouteLink 时,它使用指定的规则(这就是为什么我提到我的更新与您的情况无关)。您能否发布整个代码(所有规则、所有操作和完整视图) - 我刚刚使用新的 MVC 项目尝试了您的规则,它工作正常(页面值被覆盖)
  • 路由规则错误。但在这种情况下,我不知道@Html.RouteLink 是如何工作的,因为它获得了“默认”路线。但我通过改变我的路线规则来解决它。感谢您的帮助。
【解决方案2】:

我认为您的部分问题是您有点违反约定,并且由于 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

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多