【问题标题】:How to make Url.Action not to preserve route values?如何使 Url.Action 不保留路由值?
【发布时间】:2010-06-28 07:55:38
【问题描述】:

我有一个 MVC 2.0 应用程序,其中有一个可以按首字母浏览的项目列表,并且我在母版页上有一个用于整个项目列表的选项卡。

我想要的是母版页上的标签始终应该转到:

/items

还有 abc 的字母指向以字母开头的项目。例如,对于a,它应该转到:

/items/a

要为我使用的母版页中的选项卡生成链接:

Url.Action("Index", "Items")

问题是,如果我正在查看以a 开头的项目,所以我在/items/a,那么标签也指向这个位置,而不仅仅是/items

任何人都知道这是为什么,我该怎么做才能使用正确的 UrlHelper 方法始终指向选项卡中的/items

编辑:我的溃败如下:

    routes.MapRouteLowercase(
        "DefaultPrefixed",                                              // Route name
        "{controller}/{action}/{q}",                           // URL with parameters
        new { controller = "Items", action = "Index", q = "" },  // Parameter defaults
        new { q = @"[a-z]{1}" }                                        // constraint
    );

    routes.MapRouteLowercase(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

【问题讨论】:

  • 您的路径不能是/items/a,而是items/index/a,因为这是您定义路线的方式。

标签: asp.net-mvc url-routing


【解决方案1】:

这取决于您的路线,但假设您使用的是默认路线:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Users", action = "Index", id = UrlParameter.Optional }
);

您始终可以将可选路由值设置为空白:

Url.Action("Index", "Items", new { id = string.Empty })

【讨论】:

  • 非常感谢您的回答。我确实尝试了您的建议,但是随后将字母作为查询字符串参数放在选项卡链接中,所以我得到了 items?q=a ..... 这可能是因为我的溃败,我已经把溃败在我的问题中。
  • 发生这种情况的原因是因为您的第二条路线。这两条路线是相同的,因为它们使用相同的模式:{string}/{string}/{string},并且无法消除它们之间的歧义。删除第二条路线(带有 id 的路线)。
猜你喜欢
  • 2013-08-13
  • 2013-10-07
  • 2015-04-29
  • 2011-12-17
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多