views:

1351

answers:

2

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:

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

http://stackoverflow.com/questions/119323/

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

+1  A: 

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
+12  A: 

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
Hi, if I try this, the url generated from Html.ActionLink comes out like this:/Catalogue/BrowseBySubject/3?subject=chemistryinstead of/Catalogue/BrowseBySubject/3/chemistryAny ideas - I've added the route below the 'Default' route, and changed the name to 'BrowseBySubject".
Kieron
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