12
votes

I've looked at the routing on StackOverflow and I've got a very noobie question, but something I'd like clarification none the less.

I'm looking specifically at the Users controller

https://stackoverflow.com/Users
https://stackoverflow.com/Users/Login
https://stackoverflow.com/Users/124069/rockinthesixstring

What I'm noticing is that there is a "Users" controller probably with a default "Index" action, and a "Login" action. The problem I am facing is that the login action can be ignored and a "UrlParameter.Optional [ID]" can also be used.

How exactly does this look in the RegisterRoutes collection? Or am I missing something totally obvious?

EDIT: Here's the route I have currently.. but it's definitely far from right.

    routes.MapRoute( _
        "Default", _
        "{controller}/{id}/{slug}", _
        New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional} _
    )
2
Not sure why people are voting to close. This is a legit programming question.. I'm genuinly interested in figuring this out.Chase Florell
Where do you see the vote to close?Kevin Le - Khnle
This does not belong on Meta.Henk Holterman
I agree it's a perfectly legitimate question. People are most likely seeing that you've referenced stackoverflow.com specifically, and in infinite ignorance, voting to close because they erroneously think it should be on meta.stackoverflow.com.Chris
While I agree this question is legitimate for Stack Overflow, I wonder if it'll be easier to get a definitive answer from Jeff or any of the other SO devs on Meta. Just a thought...Chad Levy

2 Answers

5
votes

Probably just uses a specific route to handle it, also using a regex to specify the format of the ID (so it doesn't get confused with other routes that would contain action names in that position).

// one route for details
routes.MapRoute("UserProfile",
     "Users/{id}/{slug}",
     new { controller = "Users", action = "Details", slug = string.Empty },
     new { id = @"\d+" }
);
// one route for everything else
routes.MapRoute("Default",
     "{controller}/{action}/{id}",
     new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
1
votes

Without a SO developer giving a definite answer, reverse engineering could yield many possible combinations and permutations. Here's one that I think would fit too:

routes.MapRoute(
    "UserProfile",
    "Users/{id}/{slug}",
        new { controller = "Users", action = "Profile" }
);

routes.MapRoute(
    "UserLogin",
    "Users/Login",
    new { controller = "Users", action = "Login" }
);

routes.MapRoute(
    "DefaultUser",
    "Users",
    new { controller = "Users", action = "Index" }
);