7
에 의해 분할

가능한 중복 :
How do I register a controller that has been created in an AREA컨트롤러 영역

나는 질문이 있습니다 - 그것은 다음을 수행 할 수 있습니까?

나는 세 가지 영역이 있습니다 내가 같은 이름의 ApiController이 각 영역 내부

_Default 
SiteOne 
SiteTwo 

,하지만 물론 다른 네임 스페이스 :

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

는 또한 현재의 값을 (이 내가 사용하고 싶습니다) 구성의 영역. 예를 들어

/api/values 

config 파일에서 현재 지역이 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") } 
); 

답변

4

제 제안은 사용자 지정 DefaultControllerFactory를 구현하는 것입니다. 당신은 아주 좋은 예를 here

기본 컨트롤러 공장을 볼 수

은 이런 종류의 기능을 허용하지 목록에 이름으로 모든 컨트롤러를 나열합니다. 위의 기사에서는 새 팩토리를 만들고 컨트롤러 만들기를 제어하여 특정 네임 스페이스의 경로를 쉽게 일치시킬 수있는 방법을 보여줍니다.

이렇게하면 원하는 기능을 얻을 수 있습니다.

+0

과 충돌 할 수 있습니다. 다른 방법이 있다고 생각했습니다. 그래서, 나는 HTTP 컨트롤러 공장을 구현할 것이다. – Malkov

+0

아무런 도움이되지 않아서 기쁩니다. – dmportella

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

또는 _/sitetwo/values_. 하지만 그냥 _/api/values_를 쓰고 config 파일에서 구성한 Area의 컨트롤러에 대한 액세스 권한을 얻고 싶습니다. 예를 들어, 설정 파일에 SiteOne을 지정하고 url _/api/values_를 호출하면 SiteOne Area에서 컨트롤러를 가져오고 설정 파일 SiteTwo에서 영역을 변경하면 _/api/values ​​/ 나는 SiteTwo 컨트롤러를 얻을 것이다. – Malkov

+0

'name : this.AreaName + "_API"'또는 어떤 명명 규칙을 사용 하든지 제안하고 싶습니다. 따라서 루트 이름은'Admin' 대신'Admin_API'가됩니다. 또한'routeTemplate : "api /"+ this.AreaName + "/ {controller}/{id}"'를 사용하여'/ api/admin/users/123'을 사용하여 액세스 할 수 있습니다.404 오류가 발생하면 다른 일반적인 MVC 경로 인 –

7

I've created a post about how to implement the HttpControllerFactory to support Areas

그리고 지금 난 그냥 Global.asax 파일에 MapHttpRoute에 지역 이름을 지정할 수 있습니다 : 당신이 _/siteone/values_를 작성해야 컨트롤러에 접근하기 위해,이 경우

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