views:

1790

answers:

5

I created a new ASP.NET MVC project and implemented a site authorization filter.

When I map the routes to the {controller}/{action} pair, I pass a role = "SomeRole" default to the route.

It works perfectly if I go through the full url (http://localhost/somecontroller/someaction) and I specified the full route

[ MapRoute("SomeAction", "somecontroller/someaction", new { controller = 
 "SomeController", action = "SomeAction", role = "SomeRole"); ]

The problem is that when somebody visits http://thesiteaddress.com there has to be a default route that invokes /home/index instead of / and if I specify

MapRoute("Default", new {controller="somecontroller",action="action"})

then I lose the role="SomeRole" from the previous MapRoute.

How can I solve this?

+4  A: 

Make sure the Default route is at the BOTTOM of your listed route table. Order matters when it comes to ASP.NET MVC Routing tables.

George Stocker
A: 

When you don't provide the route name or the action is determined through a HTTP request it will look in order from the order they were added. The first time it finds one that matches, it stops. So what's probably happening is it's matching one previous to the one you've added.

Chad Moran
+2  A: 

Phil Haack released a route debugging tool that can be invaluable in gaining an understanding of problems like this.

With this tool you can view how your MVC application parses a URL and matches it to your RouteTable.

Ray Vernagus
+1  A: 

Actually, Gortok is right. MVC Routing respect ordering route. Your last route must be generic as possible, and your previous route must be specific as possible.

In your case, both are generic. You should

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");

and then

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});

so, you give specificity to both routes.

Jirapong
A: 

Not sure if this is an MVC 2 standard, but I found default has to be first in the global.asax list of routes. I had the default routing last, and I kept getting the first route as default until I moved it to the top.

Tim