How To Prevent Multiple ASP.NET MVC Route Mappings
asp.net, asp.net-mvc, asp.net-mvc-3, c#, html
Solution
You can pull out the controller action.
Write the URL like this:
"Foo/Bar/{action}"
Additionally, you can pull out the controller as well, and write
"Foo/{controller}/{action}"
In this case, `action = "Index"` provides a default value of "Index" if no action parameter is provided.
In this case, you need to disambiguate between `"Foo/Bar/{action}"` and `"Foo/Bar/{id}"`. Since matching is done in order, you'll want to put the `id` route first, and add a numeric constraint to the `id` parameter. This allows valid numeric ids to match it, and action names to skip down to the next route. Your two routes would look like this:
context.MapRoute(null, "Foo/Bar/{id}", new
{
action = "Index",
controller = "Bar"
},
new { id = @"\d+" });
context.MapRoute(null, "Foo/Bar/{action}", new
{
action = "Index", //optional default parameter, makes the route fall back to Index if no action is provided
controller = "Bar"
});
Problem
I have an ASP.NET MVC routing question. First, let me explain my areas setup. It's quite simple. ``` Areas | +--Foo | +--Controllers | +--BarController.cs ``` I have a folder in my areas called "Foo" and controller called "BarController.cs" The Bar controller has several methods named "DoStuff1()", "DoStuff2()", etc. My website uses the following URLs: ``` /foo/bar/15 /foo/bar/dostuff1 /foo/bar/dostuff2 ``` The first URL requires an id and uses the default Index() method in the Bar controller to populate the webpage with a view and model. In the second and third URLs, I'm using them for jQuery ajax calls. Here is the code from my area registrion ``` context.MapRoute(null, "Foo/Bar/DoStuff1", new { action = "DoStuff1", controller = "Bar" }); context.MapRoute(null, "Foo/Bar/DoStuff2", new { action = "DoStuff2", controller = "Bar" }); context.MapRoute(null, "Foo/Bar/{id}", new { action = "Index", controller = "Bar" }); ``` My problem is that for each new controller method I create, I have to add another route mapping in the area registrion file. For example, if I add the method DoStuff3(), I'll need to add this to the area registration: ``` context.MapRoute(null, "Foo/Bar/DoStuff3", new { action = "DoStuff3", controller = "Bar" }); ``` How can I create a generic route mapping to handle the URLs I mentioned above that doesn't require new additions to the area registration file for new controller methods?