views:

188

answers:

2

Hi all, trying to map the following style of route: http://site.com/username in the same way that you can do http://www.twitter.com/user

My initial solution was to have these routes:

//site.com/rathboma - maps to user details for rathboma
            routes.MapRoute("Users", "{id}", new { controller = "Users", action = "Details" });

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

And that was working fine, until I tried to do the following in my 'Links' controller:

public ActionResult Details(string id)
        {
            int newId;
            if (!int.TryParse(id, out newId))
                return RedirectToAction("Index");


            WebLink results = Service.GetWebLink(newId, 5);

            if (results == null)
                return RedirectToAction("Index");

            return View(results);
        }

These RedirectToAction methods try and return the browser to http://site.com/Users (I do have a users controller) instead of directing to http://site.com/Links/index

Why is this is happening?

How should I be organizing my routes to make this work properly?

I'm happy sacrificing http://site.com/links and moving to http://site.com/links/index if I have to. But how would I enforce that?

Thanks to all for any help

EDIT:

I know what's causing this, it's trying to redirect to http://site.com/links (the index page), but links is being picked up as a username and redirecting to /users/details, when it can't find the user 'links' it tries to redirect to the UsersController Index action which maps to /users, and the cycle continues ('users' is not a user it can find so redirects infinately).

So I guess My sub-question is: how to I make mvc always use /links/index instead of just using /links for the index page?

+2  A: 

Try adding this route before your Users route:

routes.MapRoute("Links", 
                "{controller}/{id}", 
                 new { controller = "Links", action = "Details" });

This should then work for

http://mysite.com/Links/id

&

http://mysite.com/username

BFree
A: 

I believe changing RedirectToAction("Index"); to RedirectToAction("Index", "Links"); in your Links controller should solve the issue without having to change your routes.

The problem is you have two very greedy routes. What I'd do is to break apart the default route to less greedy routes like this :

routes.MapRoute("Links", 
                "Links/{id}", 
                 new { controller = "Links", action = "Index" });


routes.MapRoute("Users", 
                "{id}", 
                 new { controller = "Users", action = "Details" });

routes.MapRoute("Default", 
                "", 
                 new { controller = "Home", action = "Index" });
Causing the urls to be like the following :
site.com/links/5  - hits the Links controller
site.com/name     - hits the Users controller
site.com/         - hits the home controller
çağdaş