从MVC4中的ActionLink中删除Route参数

时间:2014-04-24 13:59:08

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我遇到一个问题,路径数据值在我的视图中挥之不去,让我的@Html.ActionLink(...)看起来有点难看。

在我的路线中,我有这个:

routes.MapRoute(
    name: "SubItemLinked",
    url: "SubItems/{subitemId}/{controller}/{action}/{id}",
    defaults: new { controller = "DeepDownItems", action = "Index", id = UrlParameter.Optional },
    constraints: new { subitemId = "^[0-9]*$", id = "^[0-9]*$" }
);

routes.MapRoute(
    name: "ItemLinked",
    url: "Items/{itemId}/{controller}/{action}/{id}",
    defaults: new { controller = "SubItems", action = "Index", id = UrlParameter.Optional },
    constraints: new { itemId = "^[0-9]*$", id = "^[0-9]*$" }
);

上面允许我有这样的网址:

  • ~/Items/3< =将显示商品编号3的所有子项目
  • ~/Items/3/SubItems/Create< =完全符合您的期望
  • ~/SubItems/5< =显示SubItem编号为5的所有DeepDownItems

依旧......

现在,DeepDownItems控制器当然会识别subitemId参数并将其用于从数据库中检索内容。问题是,如果我想将链接放回SubItems列表,我不再需要这个subitemId,我需要将它从RouteValueDictionary中删除。

作为流程的示例,我们假设我转到~/SubItems/5,我看到了SubItem 5的所有DeepDownItems的列表,这是正确的。在那个视图中我有这个:

@Html.ActionLink("Go Back", "Index", "SubItems", new { itemId = ViewBag.itemid, subitemId = String.Empty }, null)

根据路线,这应该生成~/Items/3的链接。我不得不放subitemId = String.Empty或者它与顶级路线相匹配。问题是生成的url与此~/Items/3?subitemId=5类似,因此基本上正确匹配Route但是它没有按照指示清除subitemId参数。

您对如何做有任何想法吗?请注意,我在视图上有其他链接(编辑/创建)依赖于该参数存在并自动添加,所以我真的只想从该链接而不是整个字典中删除它。

1 个答案:

答案 0 :(得分:0)

不确定这是我过去几个小时一直在争吵的问题,但如果是:尝试使用@Html.RouteLink,您可以指定从哪条路线创建链接。

如果我能够破译你的例子,那么就像下面这样:P

@Html.RouteLink("Go Back", "ItemLinked", new {
        controller = "SubItems",
        action = "Index", 
        itemId = ViewBag.itemid,
    })