通过路由的ASP.NET MVC博客URL

时间:2011-11-07 14:25:02

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

假设我有一个新的MVC网站,我想以下列方式实现URL。从路由角度来看,最好的方法是什么?我将帖子存储在基本数据库表中。我希望从控制器/操作角度尽可能简单。

/ 2011 /(2011年所有帖子)

/ 2011/11 /(2011年11月的所有帖子)

/ 2011/11/07(2011年11月7日发布的所有帖子)

/ 2011/11/07 /确切后标题

/确切-后标题

/约

/存档

/标签/不管标签

2 个答案:

答案 0 :(得分:7)

// matches /2011/11/07/exact-post-title
routes.MapRoute(
    "ArticleDetails",
    "{yyyy}/{mm}/{dd}/{title}",
    new { controller = "Articles", action = "Details",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d", dd = @"\d\d" }
);

// matches /2011/11/07
routes.MapRoute(
    "ArticlesByDay",
    "{yyyy}/{mm}/{dd}",
    new { controller = "Articles", action = "ByDay",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d", dd = @"\d\d" }
);

// matches /2011/11
routes.MapRoute(
    "ArticlesByMonth",
    "{yyyy}/{mm}",
    new { controller = "Articles", action = "ByMonth",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d" }
);

// matches /2011
routes.MapRoute(
    "ArticlesByYear",
    "{yyyy}",
    new { controller = "Articles", action = "ByYear",
    new { yyyy = @"(19|20)\d\d." }
);

/ exact-post-title路线有点问题。这几乎与你发送的东西相匹配。你必须把所有其他可能的路线放在那个路线前面才能解决这个问题。您也可以使用/ blog或/ articles为所有这些路由添加前缀以修复它:

routes.MapRoute(
    "ExactPostTitle",
    "articles/{title}", 
    new { controller = "Articles", action = "Details" }
);

现在它不会与以下内容发生冲突:

routes.MapRoute(
    "About",
    "about",
    new { controller = "Home", action = "About" }
);

档案将类似:

routes.MapRoute(
    "Archive",
    "archive",
    new { controller = "Home", action = "Archive" }
);

最后是Tag路线:

routes.MapRoute(
    "Tag",
    "tag/{tagtext}",
    new { controller = "Tag", action = "Index" }
);

您可能需要使用路线的顺序,但一般情况下,您始终需要最具体的路线。

如果您有以下路线:

routes.MapRoute(
    "ExactTitle",
    "{title}",
    new { controller = "Articles", action = "Details" }
);

routes.MapRoute(
    "About",
    "about",
    new { controller = "Home", action = "About" }
);

第一条路线匹配/约会,因此如果它们按顺序排列会遇到问题。

答案 1 :(得分:4)

我的解决方案是:

首先包含在RouteConfig.cs

          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        **routes.MapMvcAttributeRoutes();** this is very important 
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

在控制器操作中包含您需要的路线后:

    [Route("Posts/{year}/{month}/{day}/{title}")]
    public ActionResult Post(int year, int month, int day, string title)
    {
        return View();
    }

    [Route("Posts/{year}/{month}/{day}")]
    public ActionResult Post(int year, int month, int day)
    {
        return View();
    }

    [Route("Posts/{year}/{month}")]
    public ActionResult Post(int year, int month)
    {
        return View();
    }

    [Route("Posts/{yearOrTitle}")]
    public ActionResult Post(string yearOrTitle)
    {
//logical to search year or Title
        return View();
    }