-1

现在,问题。我有一个电子商务网站,并且我有一个名为 Store 的控制器,其中包含一个操作索引。当有人键入 www.mysite.com/sony 时,我想使用参数路由到控制器存储和操作索引brand=Sony。如果有人键入 www.mysite.com/sony-tv,我想路由到控制器存储和操作索引,但使用参数brand=sonydepartment=tv.

我通过为存储在数据库中的每种情况创建路由并在应用程序启动时动态构建路由来获得这一点。它在少数情况下工作正常。首先,我需要索引路线。我需要在sony之前映射路线sony-tv,否则/sony-tv同样映射到/sony。

当我进入站点主页 (www.mysite.com) 并单击 Url.Action("Index","Store", new {brand=Sony}) 时,它会将我引导至 www.mysite.com/sony。好的!。现在,在 SONY 品牌中,我将点击 Url.Action("Index","Store", new {brand=sony, department=tv}),我可以看到所有来自 Sony 的电视。

直到这里一切都运行良好。在数据库中,我有 1 条通往 /sony 的路线,我说我有一个名为品牌的参数,其值为 Sony,以及一个受约束的命名品牌,其值为 Sony。我有另一条路线对索尼电视说同样的方式。模式sony-tv 有一个名为brand 的参数,其值为sony 和一个名为deparment 的参数,其值为tv,参数约束相同。

在我看来,这意味着 www.mysite.com/Sony 的路线是 Store/Index/brand=sony,而 www.mysite.com/sony-tv 是 Store/Index/brand=sony&department=tv。有了约束,我知道如果部门不是电视或者参数部门不存在,它将发送到 www.mysite.com/sony

当我在 www.mysite.com/sony-tv 时,如果我将鼠标移到其他品牌上,则指向 Url.Action("Index","Store", new {brand=Apple}) 的链接是 www .mysite.com/Apple-Tv 我有一条通往 Apple-TV 的路线,与索尼相同。URL 存在,但我没有传递 TV 参数。我只传递了这个链接(品牌链接)的品牌。我想将用户移至品牌的根目录,而他已移至品牌+部门。

我不知道,看起来部门变量又通过了,我不知道如何取消它。

我完全错了吗?我在做什么是有效的?我能做到吗?我的错误在哪里?

在 cshtml 文件中:

@Html.ActionLink(febrand.Name.ToUpper(), "Index", new { controller = "Store", brand= febrand.FriendlyName, department = string.Empty })

在最终的 html 文件中(显示来自 google chrome 的源代码):

<a href="/sony?department=tv">SONY</a>
4

1 回答 1

2

首先,对于您可以使用两条自定义路线进行的操作来说,这似乎需要做很多工作。此外,随着您的路由表变得更大(例如,添加更多品牌和/或部门),由于必须扫描更大的路由列表,对您站点的每个请求都将需要更长的时间来完成。

因此,让我们尝试修复您的路由表。将这两个路由放在 global.asax 中默认路由的上方:

routes.MapRoute(
    "Department",
     "{brand}-{department}",
     new { controller = "Store", action = "Index" };

routes.MapRoute(
     "Brand",
      "{brand}",
      new { controller = "Store", action = "Index" });  

至于您的问题,当您创建操作链接时,路由引擎会从您当前所在的视图中保留部门路由值。为了让它在生成链接时忘记该参数,请在不需要时为部门变量发送一个空值。

@Html.ActionLink("Apple", "Index", new{controller="Store", brand="Apple", department = string.empty});

编辑

我觉得您的路由可能处于一个奇怪的边缘情况(并且整个 SO 中都有很多这个问题的例子,例如这里这里)。除了我提供的解决方案之外,解决方案是切换到 Html.RouteLink 而不是 Html.ActionLink。

我们将要使用的 RouteLink 签名

Html.RouteLink(string linkText, string routeName, object RouteValues)

您的代码的示例品牌链接

@Html.RouteLink(febrand.Name.ToUpper(), "Brand", new { controller = "Store", action = "Index", brand= febrand.FriendlyName})
于 2013-04-12T14:20:00.213 回答