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?
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
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+” });
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
}