7
分裂

可能重复:
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") } 
); 

回答

4

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

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

默认控制器工厂只是列出不允许对这类功能的名单上的名字所有控制器。上面的文章向您展示了如何创建一个新的工厂并控制控制器的创建,使您可以轻松地将路由与特定的命名空间进行匹配。

这会给你正在寻找的功能。

+0

谢谢。我认为还有另一种方式。所以,我会实现HTTP控制器工厂。 – Malkov 2012-03-26 08:56:44

+0

没问题,很高兴能有帮助 – dmportella 2012-03-27 13:31:38

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 } 
     ); 
} 
+0

,访问你必须写_/siteone/values_控制器或_/sitetwo/values_。但我想只写_/api/values_并从配置文件中配置的Area中获取对控制器的访问权限。例如,如果我在配置文件中指定SiteOne并调用url _/api/values_,我将从SiteOne区域获取控制器,如果我将在配置文件SiteTwo中更改区域,那么如果我将调用_/api/values /我将获得SiteTwo控制器。 – Malkov 2012-03-24 13:19:19

+0

我想建议'name:this.AreaName +“_API”'或任何命名约定适合你 - 所以路由名称将是'Admin_API'而不是'Admin'。另外,我使用'routeTemplate:“api /”+ this.AreaName +“/ {controller}/{id}”',这样我可以通过'/ api/admin/users/123'来访问它。如果你得到404错误,那么你可能与另一个正常的MVC路线冲突 – 2014-07-11 05:03:58