Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC 2 RC2路由-当使用ActionLink引用更高级别时,如何清除低级值?_Asp.net Mvc_Asp.net Mvc 2_Routing_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc ASP.NET MVC 2 RC2路由-当使用ActionLink引用更高级别时,如何清除低级值?

Asp.net mvc ASP.NET MVC 2 RC2路由-当使用ActionLink引用更高级别时,如何清除低级值?,asp.net-mvc,asp.net-mvc-2,routing,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 2,Routing,Asp.net Mvc Routing,[注意:我使用的是ASP.NET MVC2 RC2。] 我有如下URL: /客户/123/订单/456/项目/索引 /客户/123/订单/456/项目/789/编辑 我的路由表首先列出了最具体的路由,因此我得到: // customers/123/orders/456/items/789/edit routes.MapRoute( "item", // Route name "customers/{customerId}/orders/{orderId}/items/{itemI

[注意:我使用的是ASP.NET MVC2 RC2。]

我有如下URL:

/客户/123/订单/456/项目/索引

/客户/123/订单/456/项目/789/编辑

我的路由表首先列出了最具体的路由,因此我得到:

// customers/123/orders/456/items/789/edit
routes.MapRoute(
    "item", // Route name
    "customers/{customerId}/orders/{orderId}/items/{itemId}/{action}", // URL with parameters
    new { controller = "Items", action = "Details" }, // Parameter defaults
    new { customerId = @"\d+", orderId = @"\d+", itemId = @"\d+" } // Constraints
);

// customers/123/orders/456/items/index
routes.MapRoute(
    "items", // Route name
    "customers/{customerId}/orders/{orderId}/items/{action}", // URL with parameters
    new { controller = "Items", action = "Index" }, // Parameter defaults
    new { customerId = @"\d+", orderId = @"\d+" } // Constraints
);
当我在项目“编辑”页面时,我想要一个链接回到“索引”页面。因此,我使用:

ActionLink("Back to Index", "index")
但是,由于存在环境项ID,这将导致URL:

/客户/123/订单/456/项目/789/索引

…而我希望它“忘记”项目ID,只使用:

/客户/123/订单/456/项目/索引

我已尝试覆盖项目ID,如下所示:

ActionLink("Back to Index", "index", new { itemId=string.empty })
…但这不太管用。这给我的是:

/客户/123/订单/456/项目?项目ID=789

如何说服
ActionLink
忘记项目ID?


编辑:固定问题-我指的是“订单”,我指的是“物品”


编辑:添加了为什么itemId=string.empty不起作用的详细信息。

我删除了以前的答案,没有注意到它们是同一个控制器。尝试设置itemId=string.empty。这将使第一条路由失败,因为它需要在该位置输入一个数字

ActionLink("Back to Index", "index", new { itemId=string.empty })
或者,您可以手动创建带有路由“项”名称的链接


好的,我想我可以用RouteLink而不是ActionLink来做我想做的事情:

RouteLink("Back to Index", "items", new { action="index" })
…其中第2个参数是我要显式调用的路由的名称



编辑:我真的不想浏览所有的
操作链接
,并将它们放在这个表单中,因此我修改了“item”规则,在
{action}
参数中包含一个约束,“index”与这个路径不匹配。因此,它与“items”路由匹配,而“items”路由没有
itemId
参数。这似乎是一种更简单的方法,因为我的大部分代码是不变的。

在您的约束中,您可以删除任何不需要的RouteValue

values.Remove("itemId");
然后创建一个从IRouteConstraint继承的类

然后在Match方法中清除路由值并返回true(指示路由匹配)

然后在Global.asax.cs中更改

new { customerId = @"\d+", orderId = @"\d+" }

从根本上解决问题 似乎最佳解决方案(闻起来不像是一种变通方法)是解决问题的方案,它有根并且在路由中

我已经编写了一个名为
routeWitheExclusions
的自定义
Route
类,它能够定义在生成URL时应排除/删除的路由值名称


整个问题在中进行了详细说明,所有代码也在其中提供。检查它,它可能会帮助您解决这个路由问题,而不使用约束,但使用一个符合要求的路由。

@Jab:请查看我编辑的答案,以了解为什么itemId=string.empty不起作用。@Jab:RouteUrl确实起作用,但必须显式指定所有路由值是一件非常痛苦的事情。(ActionLink让我变得懒惰)。然而,我确实在RouteLink上取得了成功——看我的答案。听起来不错,但“在你的约束下”是什么意思?这段代码到哪里去了?哇。我对您对路由基础设施的了解表示敬意。我想我可以创建一个约束类,它接受要在构造函数中忽略的路由值(名称)列表。但是,对我来说,这似乎仍然是一种太多的干预——无论是在编写代码的数量上,还是在违反规则的程度上。就我个人而言,我认为这应该是开箱即用的——这似乎是一个疏忽。我会接受你的答案,但实际上我已经“解决”了这个问题,根据我自己的答案对动作参数进行了约束。零代码解决方案对我来说是最简单的。我同意这一点。然而,我们有多少工作让它正常工作?
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{

    values.Remove("itemId");    
    return true;
}
new { customerId = @"\d+", orderId = @"\d+" }
new { customerId = @"\d+", orderId = @"\d+", custom=new MyNewConstraint() }