Question

Possible Duplicate:
How do I register a controller that has been created in an AREA

I have the question - is it possible to do the next?

I have three Areas:

_Default
SiteOne
SiteTwo

Inside each area i have a ApiController with the same name, but in different namespaces of course:

MvcAppliaction.Areas._Default.Controllers.ValuesController
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController

I also have a value of current (which i would like to use) Area in configuration.

I would like to map user to controller in the proper Area (which i can find in the configuration) if he enters in the browser:

/api/values

For example, if current Area in config file is SiteOne then this request should be mapped to MvcAppliaction.Areas.SiteOne.Controllers.ValuesController controller, but if i change current Area in config file to SiteTwo of _Default it should be mapped to correct controller.

PS. With MVC controller it's easy, you just have to set your route:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") }
);
Was it helpful?

Solution

My Suggestion would be to implement a custom DefaultControllerFactory.

You can see a very good example here

The default controller factory just lists all controllers by name on a list not allowing for this kind of functionality. The article above shows you how to create a new factory and take control over the controller creation allowing you to easily match routes to specific namespace's.

That would give the functionality you are looking for.

OTHER TIPS

Try adding the following using statement and modifying the route registration in your AreaRegistration.cs file.

using System.Web.Http;
...
public override void RegisterArea(AreaRegistrationContext context)
{
        context.Routes.MapHttpRoute(
            name: this.AreaName,
            routeTemplate: this.AreaName + "/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
}

I've created a post about how to implement the HttpControllerFactory to support Areas

And now i can just specify area name in MapHttpRoute in the Global.asax file:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional }
        );
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top