我需要添加http://mysite/categoryname路由,所以我添加了
routes.MapRoute(
"Categories",
"{CategoryName}",
new { controller = "News", action = "Category", CategoryName = "" },
new string[] { "MyProj.Controllers" }
);
问题是,如果我在
之前添加它routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "News", action = "Index", id = UrlParameter.Optional },
new string[] { "MyProj.Controllers" }
);
首页出错是因为它进入了类别路线;如果我在最后位置添加类别路线,则永远不会输入,http://mysite/category_name会给我404。
我做错了什么?
答案 0 :(得分:5)
你有几个选择:
更改您的新闻类别路线以包含硬路径:
routes.MapRoute(
"Categories",
"category/{CategoryName}",
new { controller = "News", action = "Category", CategoryName = "" },
new string[] { "MyProj.Controllers" }
);
更改默认路线以包含硬路径:
routes.MapRoute(
"Default", // Route name
"site/{controller}/{action}/{id}", // URL with parameters
new { controller = "News", action = "Index", id = UrlParameter.Optional },
new string[] { "MyProj.Controllers" }
);
滚动您自己的自定义路由类
有关不相关的示例,请参阅http://hanssens.org/post/ASPNET-MVC-Subdomain-Routing.aspx。
答案 1 :(得分:1)
无论你如何做到这一点,当你添加类别时,你显然会冒着踩到网站中其他页面的风险 - 例如,如果你的网站部分名为/ account,然后有人创建了一个类别命名,“帐户”,应该发生什么?
那就是说,比编写自己的路由类更简单。您可以在类别路径中使用正则表达式,并将其作为第一个规则。例如,如果网站上只有两个类别是夹克和毛衣:
routes.MapRoute(
"Categories",
"{CategoryName}",
new { controller = "News", action = "Category" },
new { CategoryName = "(jackets|sweaters)" }
);
最后一个参数是一个基于Regex的RouteConstraint,因此如果路径既不是/ jackets也不是/ sweaters,路由将遵循其后面包含的路由。
显然你想要比这更健壮,所以你可以创建一个在app启动时构建Regex的方法:
routes.MapRoute(
"Categories",
"{CategoryName}",
new { controller = "News", action = "Category" },
new { CategoryName = "(" + String.Join("|", categories) + ")" }
);
categories
这里需要您提供的内容 - 应用中类别名称的某些数组或数据库Feed。