ASPNET MVC路由问题

时间:2011-12-01 22:20:56

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

我需要添加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。

我做错了什么?

2 个答案:

答案 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。