Enum的ASP NET MVC3路由

时间:2012-11-19 12:40:56

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

我通过允许格式为~/{category}/{title}

的网址设置路由以允许SEO(和人类)友好的网址

所有这些都应该路由到具有适当重定向方法的内容控制器。我还想允许~/{category}将您带到过滤后的索引。

所有这些对我有用:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Category And Title", // Route name
        "{category}/{title}", // URL with parameters
        new { controller = "Content", action = "SeoRouting", title = UrlParameter.Optional }, // Parameter defaults
        new { category = "People|IT|Personnel|Finance|Procedures|Tools"}
        ); 

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults
        );

}

但如果类别发生变化,那么我需要在两个地方更改它们。在Global.asax和enum中我们有类别。

在一个理想的世界中,如果路径的第一部分中的值与ContentCategory枚举匹配(不区分大小写),则不喜欢使用的第一个路由,如果不匹配,则使用默认路由。

这些类别很快就会发生变化所以这不是一件大事,但如果感觉应该是可能的话。

1 个答案:

答案 0 :(得分:11)

对不起,我对实际问题有些疑惑,但你可以通过使用实际枚举生成正则表达式对象来解决“在两个地方更改代码”(排序):

routes.MapRoute(
    "Category And Title", // Route name
    "{category}/{title}", // URL with parameters
    new { controller = "Content", action = "SeoRouting", title = UrlParameter.Optional }, // Parameter defaults
    new { category = getCategories() }
    ); 

private static string getCategories()
{
     var categories = Enum.GetNames(typeof(ContentCategory));
     return string.Join("|", categories);
}