0

使用默认路由:

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

正在生成的 URL 如下所示:www.domain.com/Home/Index/Category

但是,如果用户正在浏览特定类别,我希望 URL 看起来像这样:www.domain.com/Home/Category

如果没有选择类别:www.domain.com/Home

我添加了这段代码:

routes.MapRoute(null, "{controller}/{category}", new { action = "Index" });
routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });

并且 URL 开始看起来像我想要的那样,但是!在控制器中调用动作的表单方法不再起作用:

@using (Html.BeginForm("AddToCart", "Home"))
                            {                
                                @Html.Hidden("category", Model.CurrentCategory)
                                @Html.Hidden("productId", p.ProductId)
                                <input type="submit" value="Add To Cart" />
                            }

由于某种原因,表单操作方法似乎调用了错误的路线,即:

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

并不是

routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });

因为当单击提交按钮时,浏览器重定向到 url: www.domain.com/Home/AddToCart 并且永远不会调用“Home”控制器中的操作方法“AddToCart”。

4

1 回答 1

0

它不起作用,因为 MVC 框架将使用匹配的第一个路由。这是:

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

路由机制无法区分

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

     routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });

您需要像 {controller}/Categories/{category} 这样的路线才能正确匹配。(如果“类别”不打扰你)

另一种方法是使用正则表达式作为约束来匹配类别名称,如果匹配失败,路由会落入您的第二个配置,因此您的表单将继续工作。

看看http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

于 2013-07-16T21:49:57.873 回答