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"从未被调用。
它不起作用,因为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