Search code examples
asp.net-mvcasp.net-mvc-5asp.net-mvc-routing

How to have a date "folder" in an MVC Url


I want to change the site I'm working on so that when someone creates an article, the path would be "Articles/ViewArticle/2016-10-04/test" instead right now it's just "Articles/ViewArticle/test". When I implemented it, I got an instant 404.

I tried creating this route before & after the Default Route, but still no go:

routes.MapRoute(
    name: "ArticlesDefault",
    url: "{controller}/{action}/{date}/{id}",
    defaults: new { controller = "Articles", action = "ViewArticle", date = UrlParameter.Optional, id = UrlParameter.Optional }
);

I should note that the "id" is actually stored in the database as [date]/ArticleTitle.

Would anyone be able to help?


Solution

  • Use attribute routing instead. By using attribute routing you can construct the routes using the values of parameters passed to action methods.

    More information on attribute routing is here https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

    if you do not want to use attribute routing, you can use constraints parameter of MapRoute method

    Edit:

    You can try any one of following approach

    1. Without using attribute routing. I assume that your Id is in the form of {date}/articleTitle

      routes.MapRoute(
      name: "ArticlesDefault",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Articles", action = "ViewArticle" },
      constraints: new { id = “\\d+” });
      
    2. Using attribute routing. Best approach will be to separate article date and article title into two distinct parameters. Then you can use the following code.

      [Route("Articles/ViewArticle/{articleDate:datetime}/{articleTitle}")]
      public ActionResult ViewArticle(string articleTitle, DateTime articleDate)
      {
        //your action code goes here
      }