控制器按区域划分

Mal*_*kov 7 c# asp.net-mvc-areas asp.net-web-api asp.net-web-api-routing

可能重复:
如何注册已在AREA中创建的控制器

我有一个问题 - 是否可以做下一个?

我有三个方面:

_Default
SiteOne
SiteTwo
Run Code Online (Sandbox Code Playgroud)

在每个区域内我都有一个名称相同的ApiController,但当然在不同的名称空间中:

MvcAppliaction.Areas._Default.Controllers.ValuesController
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController
Run Code Online (Sandbox Code Playgroud)

我还有一个当前值(我想使用)的配置区域.

如果他进入浏览器,我想将用户映射到适当区域(我可以在配置中找到)中的控制器:

/api/values
Run Code Online (Sandbox Code Playgroud)

例如,如果配置文件中的当前区域是SiteOne,则此请求应映射到MvcAppliaction.Areas.SiteOne.Controllers.ValuesController控制器,但如果我将配置文件中的当前区域更改为_Default的SiteTwo,则应将其映射到正确的控制器.

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") }
);
Run Code Online (Sandbox Code Playgroud)

Kev*_*man 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 }
        );
}
Run Code Online (Sandbox Code Playgroud)


Mal*_*kov 7

我已经创建了一篇关于如何实现HttpControllerFactory以支持区域的帖子

现在我可以在Global.asax文件中的MapHttpRoute中指定区域名称:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)


dmp*_*lla 4

我的建议是实现一个自定义的 DefaultControllerFactory。

你可以在这里看到一个很好的例子

默认控制器工厂仅按名称列出列表中的所有控制器,不允许此类功能。上面的文章向您展示了如何创建一个新工厂并控制控制器的创建,使您可以轻松地将路由匹配到特定的命名空间。

这将提供您正在寻找的功能。