【问题标题】:Controllers split by areas [duplicate]控制器按区域划分[重复]
【发布时间】:2012-04-07 19:49:21
【问题描述】:

可能重复:
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 控制器,但是如果我将配置文件中的当前区域更改为 _Default 的 SiteTwo,它应该映射到正确的控制器。

附言。使用 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") }
);

【问题讨论】:

    标签: c# asp.net-web-api asp.net-mvc-areas asp.net-web-api-routing


    【解决方案1】:

    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】:

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

      你可以看到一个很好的例子here

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

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

      【讨论】:

      • 谢谢。我以为还有另一种方法。所以,我将实现 HTTP 控制器工厂。
      • 没问题很高兴为您提供帮助
      【解决方案3】:

      尝试在您的 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 }
              );
      }
      

      【讨论】:

      • 在这种情况下,要访问控制器,您必须编写 /siteone/values/sitetwo/values。但我只想写 /api/values 并从我在配置文件中配置的区域获取对控制器的访问权限。例如,如果我在配置文件中指定 SiteOne 并调用 url /api/values 我将从 SiteOne 区域获取控制器,如果我将在配置文件 SiteTwo 中更改区域,那么如果我将调用_/api/values/ 我将获得 SiteTwo 控制器。
      • 我想建议 name: this.AreaName + "_API" 或任何适合您的命名约定 - 所以路线名称将是 Admin_API 而不仅仅是 Admin。此外,我使用了routeTemplate: "api/" + this.AreaName + "/{controller}/{id}",因此我可以使用/api/admin/users/123 访问它。如果你得到 404 错误,那么你可能与另一个正常的 MVC 路由冲突
      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2011-09-21
      • 2010-12-12
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多