C#MVC自定义路由设计

本文关键字:路由 自定义 C#MVC | 更新日期: 2023-09-27 18:22:35

默认路由为:

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开始看起来像我想要的那样,但是!在控制器中调用操作的Form方法不再工作:

@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 });

因为当点击提交按钮时,浏览器重定向到网址:www.domain.com/Home/AddToCart,并且"主页"控制器中的操作方法"AddToCart"从未被调用。

C#MVC自定义路由设计

它不起作用,因为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