7

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

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

我有三个领域:

_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 控制器,但是如果我将配置文件中的当前区域更改为 _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") }
);
4

3 回答 3

12

尝试在 AreaRegistration.cs 文件中添加以下 using 语句并修改路由注册。

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 }
        );
}
于 2012-03-24T03:54:34.683 回答
7

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

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

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional }
        );
于 2012-03-26T14:50:45.740 回答
4

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

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

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

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

于 2012-03-24T16:21:02.940 回答