可能重复:
How do I register a controller that has been created in an AREA
我有一个问题 - 可以做下一个吗?
我有三个方面:
_Default
SiteOne
SiteTwo
在每个区域内我都有一个名称相同的ApiController,但当然在不同的名称空间中:
MvcAppliaction.Areas._Default.Controllers.ValuesController
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController
我还有一个当前值(我想使用)配置区域。
如果他进入浏览器,我想将用户映射到适当区域(我可以在配置中找到)中的控制器:
/api/values
例如,如果配置文件中的当前区域是SiteOne,那么此请求应该映射到MvcAppliaction.Areas.SiteOne.Controllers.ValuesController控制器,但是如果我将配置文件中的当前区域更改为SiteTwo的_Default,则应将其映射到正确的控制器。
PS。使用MVC控制器很简单,您只需设置路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") }
);
答案 0 :(得分:12)
尝试添加以下using语句并在AreaRegistration.cs文件中修改路由注册。
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 }
);
}
答案 1 :(得分:7)
I've created a post about how to implement the HttpControllerFactory to support Areas
现在我可以在Global.asax文件中的MapHttpRoute中指定区域名称:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional }
);
答案 2 :(得分:4)
我的建议是实现自定义DefaultControllerFactory。
你可以看到一个很好的例子here
默认控制器工厂只列出列表中不允许此类功能的所有控制器。上面的文章向您展示了如何创建一个新工厂并控制控制器创建,使您可以轻松地将路由匹配到特定的命名空间。
这将提供您正在寻找的功能。