39

How do I generate friendly URLs within the ASP.NET MVC Framework? For example, we've got a URL that looks like this:

http://site/catalogue/BrowseByStyleLevel/1

The 1 is Id of the study level (Higher in this case) to browse, but I'l like to reformat the URL in the same way StackOverflow does it.

For example, these two URLs will take you to the same place:

https://stackoverflow.com/questions/119323/nested-for-loops-in-different-languages

https://stackoverflow.com/questions/119323/

EDIT: The friendly part of the url is referred to as a slug.

Community
  • 1
  • 1
Kieron
  • 24,968
  • 14
  • 72
  • 113

3 Answers3

52

There are two steps to solve this problem. First, create a new route or change the default route to accept an additional parameter:

routes.MapRoute(  "Default", // Route name
                   "{controller}/{action}/{id}/{ignoreThisBit}", 
                   new { controller = "Home", 
                         action = "Index", 
                         id = "",
                         ignoreThisBit = ""}  // Parameter defaults )

Now you can type whatever you want to at the end of your URI and the application will ignore it.

When you render the links, you need to add the "friendly" text:

<%= Html.ActionLink("Link text", "ActionName", "ControllerName",
                    new { id = 1234, ignoreThisBit="friendly-text-here" });
Craig Stuntz
  • 123,797
  • 12
  • 247
  • 268
  • 1
    Hi, if I try this, the url generated from Html.ActionLink comes out like this: /Catalogue/BrowseBySubject/3?subject=chemistry instead of /Catalogue/BrowseBySubject/3/chemistry Any ideas - I've added the route below the 'Default' route, and changed the name to 'BrowseBySubject". – Kieron Oct 20 '08 at 14:00
  • 6
    That means it's not finding the right route. Move the route above Default (which will hide default, if nothing else distinguishes them, like a constraint). Use a constraint to make this new route be found only when needed (e.g., on Catalogue/BrowseBySubject, or whatever your rule is). – Craig Stuntz Oct 20 '08 at 15:09
  • 1
    @CraigStuntz ,your method seems easy compared to others. but will this be SEO friendly ? – Shaiju T May 07 '15 at 08:26
3

This is how I have implemented the slug URL on my application. Note: The default Maproute should not be changed and also the routes are processed in the order in which they're added to the route list.

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home",
          action = "Index",
          id = UrlParameter.Optional
    } // Parameter defaults
);
routes.MapRoute("Place", "{controller}/{action}/{id}/{slug}", new { controller = "Place", action = "Details", id = UrlParameter.Optional,slug="" });
Hamid Tavakoli
  • 4,217
  • 1
  • 30
  • 33
1

you have a route on the global.asax

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

you can define your own route like :

controller is the cs class inside the the controllers folder.

you can define your id - with the name you choose.

the system will pass the value to your actionResult method.

you can read more about this step here : http://www.asp.net/learn/mvc/tutorial-05-cs.aspx

Moran Helman
  • 17,632
  • 4
  • 21
  • 22