由于MVC 4中的段变量重用,生成错误的传出URL

时间:2013-05-26 05:01:05

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

这是我的RouteConfig.cs

routes.MapRoute(null,
                        "{controller}/Page{page}",
                        new {controller = "Product", action = "Index", category = (string) null},
                        new {page = @"\d+"}
            );

        routes.MapRoute(null,
                        "{controller}/{category}",
                        new {controller = "Product", action = "Index", page = 1}
            );

        routes.MapRoute(null,
                        "{controller}/{category}/Page{page}",
                        new {controller = "Product", action = "Index"},
                        new {page = @"\d+"}
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

以下是生成网址的代码:

@Html.ActionLink("View Cart", "Index", "ShoppingCart", null, new { @class = "btn btn-orange" })

我导航到Product/Page2Product/LaptopProduct/Laptop/Page2时效果很好。问题是,只要我当前的网址包含Page段,它就会尝试重复使用该细分来生成传出的网址。因此,如果我在Product/Page2,则上面生成的网址为ShoppingCart/Page2。我不知道如何避免这种情况。

请帮帮我。非常感谢你。

修改!!!

我找到了解决方法。我没有使用ActionLink,而是像这样使用RouteLink

@Html.RouteLink("View Cart", "Default", new { controller = "ShoppingCart", action = "Index" }, new { @class = "btn btn-orange" })

但我仍然想使用ActionLink,所以请帮助我。

修改!!!

当我生成指向ShoppingCart/Checkout的链接时,解决方法不起作用。我仍然需要在Index控制器中进行ShoppingCart操作。

2 个答案:

答案 0 :(得分:1)

创建一个特定于ShoppingCart的新路线模式,并通过将其置于TOP 使其成为第一条路线。

    routes.MapRoute(null,
                    "ShoppingCart/{action}",
                    new {controller = "Product"});
        );

通常,所有特定路线都应该首先出现。

答案 1 :(得分:0)

这是因为路由系统在尝试匹配路由时尝试评估段变量的值的方式。

因此,当使用以下参数进行渲染链接的调用时:

@Html.ActionLink("View Cart", "Index", "ShoppingCart", null, new { @class = "btn btn-orange" })

使用模板

评估路线时的框架

{controller}/Page{page}

会将controller段变量解析为ShoppingCart但是当它找不到page段变量的值时(通过方法调用中的任何参数),它将会然后尝试从ViewContext中的RouteData对象解析该值。由于您已导航到Product/Page2,因此路线值字典中page的当前值为2

您可以在渲染该视图时查看ViewContext.RouteData.Values["page"]的值来检查这一点。