Controllers split by areas [duplicate]

2019-01-17 18:07发布

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") }
);

3条回答
2楼-- · 2019-01-17 18:34

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.

查看更多
劳资没心,怎么记你
3楼-- · 2019-01-17 18:35

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 }
        );
}
查看更多
兄弟一词,经得起流年.
4楼-- · 2019-01-17 18:53

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 }
        );
查看更多
登录 后发表回答