【发布时间】:2014-04-24 13:59:07
【问题描述】:
我遇到了一个问题,RouteData 值在我的视图中挥之不去,让我的 @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 -
~/Items/3/SubItems/Create -
~/SubItems/5
等等……
现在,DeepDownItems 控制器当然会识别subitemId 参数并将其用于从数据库中检索内容。问题是,如果我想将链接放回 SubItems 列表,我不再需要这个 subitemId,我需要将它从 RouteValueDictionary 中删除。
作为流程的一个例子,假设我去~/SubItems/5,我看到了SubItem 5 的所有DeepDownItems 的列表,这是正确的。在那个视图中我有这个:
@Html.ActionLink("Go Back", "Index", "SubItems", new { itemId = ViewBag.itemid, subitemId = String.Empty }, null)
根据 Routes,这应该会生成一个指向 ~/Items/3 的链接。我必须输入subitemId = String.Empty,否则它会与顶级路线相匹配。问题是生成的url是这样的~/Items/3?subitemId=5,所以基本上是正确匹配了Route但是没有按照说明清除subitemId参数。
您对如何操作有任何想法吗?请注意,我在视图上有其他链接(编辑/创建)依赖于该参数存在并自动添加,因此我真的只想从该链接中删除它,而不是从整个字典中删除。
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing