2010-03-26 2 views
1

지도 경로를 변경하여 컨트롤러 및 작업뿐만 아니라 다른 디렉터리를 가질 수 있습니다. 내가 원하는 무엇MapRoute를 수정하는 방법 (새 디렉터리 추가)

내가 "모듈"당 컨트롤러를 분리 할 수있는 방법 때문에 컨트롤러

 routes.MapRoute(
      "Default",          // Route name 
      "{module}/{controller}/{action}/{id}",   // URL with params 
      new { module = "module", controller = "controller", action = "Index", id = ""} 

이것은 내가 원하는,하지만 코드가 작동하지 않습니다하기 전에 다른 디렉토리를하는 것입니다. MapRoute를 변경하기 위해 더 많은 것을 변경해야합니까?

+1

왜 그냥 영역을 사용할 수 있습니까? ASP.NET MVC 2에 있습니다. –

답변

1

나는 더 나은 해결책이 없지만 내 자신의 ViewEngine을 구현하려고합니다.

컨트롤러가 모듈에있어 표준 ASP.NET MVC 규칙 및 라우트를 해결할 수없는 경우.

지원하기 위해 자신의 ViewEngine을 구현해야한다고 생각합니다. 예를 들어

:

public class ModuleViewEngine: WebFormViewEngine 
{ 
    public ModuleViewEngine() 
    { 
     ViewLocationFormats = new[] 
        { 
         "~/views/{2}/{1}/{0}.aspx", 
         "~/views/{2}/{1}/{0}.ascx", 
         "~/views/Shared/{1}/{0}.aspx", 
         "~/views/Shared/{1}/{0}.ascx", 
        }; 
     MasterLocationFormats = new[] 

     { 
       "~/views/{1}/{0}.master", 
       "~/views/Shared/{0}.master", 
       "~/views/{2}/{1}/{0}.master", 
       "~/views/{2}/Shared/{0}.master", 
     }; 
    } 

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, 
    string partialViewName, bool useCache) 
    { 
     //coede 
    } 

    public override ViewEngineResult FindView(
     ControllerContext controllerContext, 
    string viewName, string masterName, bool useCache) 
    { 
     //code 
    } 
} 

우리는 추가 매개 변수 (지역)을 수용하기 ViewLocationFormats 및 MasterLocationFormats 배열을 재정의. 보기 위치는 표준 문자열 서식 지정 자리 표시자를 사용합니다. 첫 번째 자리 표시자는 동작 이름을 나타냅니다. 두 번째 자리 표시자는 제어기 이름이고 마지막 자리 표시 자이며 은 모듈 이름 (지정된 경우)입니다.

FindPartialView 및 FindView 메서드가 있으므로이 메서드도 재정의해야합니다. 우리의 컨트롤러가 이제 컨트롤러 폴더의 하위 폴더에 상주하기 때문에

, 우리는 추가 컨트롤러 네임 스페이스를 등록해야 :

ControllerBuilder.Current.DefaultNamespaces.Add ("Module.Controllers.something");

기본 컨트롤러 빌더는 특정 컨트롤러에 대한 경로를 일치시킬 때 전체 어셈블리에서 컨트롤러를 찾는 을 반영하지 않으므로 필요합니다.