One common question about ASP.Net MVC is how to make “default” controller.
Most websites will have a Home
controller with actions like About
, FAQ
, Privacy
, or similar pages. Ordinarily, these actions can only be accessed through URLs like ~/Home/About
. Most people would prefer to put these URLs directly off the root: ~/About
, etc.
Unfortunately, there is no obvious way to do that in ASP.Net MVC without making a separate route or controller for each action.
You cannot simply create a route matching "/{action}"
and map it to the Home
controller, since such a route would match any URL with exactly one term, including URLs meant for other controllers. Since the routing engine is not aware of MVC actions, it doesn’t know that this route should only match actions that actually exist on the controller.
To make it work, we can add a custom route constraint that forces this route to only match URLs that correspond to actual methods on the controller.
To this end, I wrote an extension method that scans a controller for all action methods and adds a route that matches actions in that controller. The code is available at gist.github.com/1225676. It can be used like this:
routes.MapDefaultController<Controllers.HomeController>();
This maps the route "/{action}/{id}"
(with id
optional) to all actions defined in HomeController
. Note that this code ignores custom ActionNameSelectorAttribute
s (The built-in [ActionName(…)]
is supported).
For additional flexibility, you can also create custom routes that will only match actions in a specific controller. This is useful if you have a single controller with a number of actions that has special route requirements that differ from the rest of your site.
For example:
routes.MapControllerActions<UsersController>( name: "User routes", url: "{userName}/{action}" defaults: new { action = "Index" } );
(Note that this example will also match URLs intended for other controllers with the same actions; plan your routes carefully)