Controllers split by areas [duplicate]

雨燕双飞 提交于 2019-12-17 18:33:37

问题


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

回答1:


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.




回答2:


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



回答3:


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


来源:https://stackoverflow.com/questions/9836030/controllers-split-by-areas

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!