Search code examples
asp.net-mvcasp.net-mvc-5asp.net-mvc-routingasp.net-routing

combine two routes to one action


I'd like to define one MapRoute which can map two different routes to one action.

I have an action to create an address:

public class AddressesController : BaseController
{
    public ActionResult Create()
    {
        ...
    }
}

Following two routes should map to the action:

/Addresses/Create -> To create a new address
/Projects/3/Addresses/Create -> To create a new address to the project with the id = 3

I tried the following MapRoute config to accomplish this, but didn't work:

routes.MapRoute(
    name: "CreateAddress",
    url: "{projects}/{projectId}/{controller}/{action}",
    defaults: new { projects = "", projectId = UrlParameter.Optional, controller = "Addresses", action = "Create" },
    constraints: new { project = "(Projects)?" });

With this config the route /Projects/3/Addresses/Create is working but not /Addresses/Create.


Solution

  • You can't have both ways working in the same route.

    You need to specify only the extra route, because ASP.NET MVC comes with a default one that will make sure that /Addresses/Create will work:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    

    For the /Projects/3/Addresses/Create put this before the above route:

    routes.MapRoute(
        name: "CreateAddress",
        url: "Projects/{projectId}/{controller}/{action}",
        defaults: new { controller = "Addresses", action = "Create" });