控制器按区域划分

本文关键字:划分 区域 控制器 | 更新日期: 2023-09-27 18:28:41

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

我有一个问题——下一个可能吗?

我有三个领域:

_Default
SiteOne
SiteTwo

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

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

我在配置中还有一个值current(我想使用它)Area。

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

/api/values

例如,如果配置文件中的当前Area是SiteOne,则此请求应映射到MvcAppliaction.Areas.SiteOne.Controllers.ValuesController控制器,但如果我将配置文件中当前Area更改为_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") }
);

控制器按区域划分

尝试添加以下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 }
        );
}

我创建了一篇关于如何实现HttpControllerFactory以支持Areas 的文章

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

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

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

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

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

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