【问题标题】:Asp.net MVC Routing always to Root with parametersAsp.net MVC 始终使用参数路由到 Root
【发布时间】:2013-04-05 01:44:29
【问题描述】:

现在,问题。我有一个电子商务网站,我有一个名为 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>

【问题讨论】:

    标签: c# asp.net asp.net-mvc routing url-routing


    【解决方案1】:

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

    所以,让我们尝试修复您的路由表。将这两条路由高于您在 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 中都有很多此问题的示例,例如 herehere)。除了我提供的解决方案之外,解决方案是切换到 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})
    

    【讨论】:

    • 感谢您的关注。 department=null 指令返回一个编译器(vs2012)错误:无法将 分配给匿名类型属性。这是正确的?我做错了什么?
    • 尝试分配部门 = string.empty
    • 另一个错误,现在在 maprout 指令中:路由 URL 不能以 '/' 或 '~' 字符开头,并且不能包含 '?'我不能使用的字符 /{brand} :(
    • 这就是我急于回答的结果。从路线的开头删除 /
    • 放轻松,如果我不需要帮助,为什么我会在这里发帖?这是我第一次使用友好的 url,所以我还不知道“规则”。再次抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多