2012-10-29 5 views
1

현재 사용자가 환경 설정을 기반으로 테마와 레이아웃을 선택할 수있는 솔루션을 찾고 있습니다.ASP MVC 테마 영역

노란색과 초록색 테마를 제공하는 웹 사이트가 있다고 가정 해 보겠습니다.

두 가지 레이아웃 : 두 개의 열과 세 개의 열 레이아웃 및 일부 부분보기는 다르게 구성되고 다른 기능적 측면을 갖습니다.

가장 좋은 방법은 영역을 사용하는 것이지만 URL 구조가 전혀 변경되지 않기를 바랄뿐입니다. 액션이 실행될 때 장면 뒤에있는 영역을 설정하는 변수를 사용합니다.

예를 들어 레이아웃을 3 열로 설정하고 녹색 테마를 사용하고 있습니다. 특정 뷰가있는 3Cols 영역을 사용 하겠지만 컨트롤러는 2Cols 레이아웃과 똑같은 코드를 구현하므로 컨트롤러를 복제하고 싶지는 않습니다. 레이아웃 및 테마

  • 사용
  • 가 독립적으로 동일한 URL이 각 레이아웃에 대해 하나의 컨트롤러를 swith를하는

    • 사용 분야 :

      그래서, 달성하기 위해 노력하고있어의 요점을 되풀이이있다 선택한 레이아웃에서

    어떤 생각/제안 사항이 있습니까?

    감사합니다.

  • +1

    영역을 사용하면 사이트의 URL 구조가 변경됩니다. 동일한 요청에 대해 응답 할 수있는 영역은 두 개가 아니며 라우팅의 일부입니다. 요청을 캡처하고 사용자가 선택한 테마를 기반으로 경로에 영역을 삽입 할 수있는 기본 클래스를 만드는 것도 가능합니다. 필자는 자신 만의 뷰 엔진과 플러그인 시스템을 만들어 멀티 테넌트 응용 프로그램을 만들었습니다.이 응용 프로그램을 사용하면 컨트롤러 및/또는 특정 클라이언트에 대한보기를 재정의 할 수 있지만 필요한 것보다 더 복잡한 방식으로 볼 수 있습니다. 아마도 자신의 뷰 엔진을 생성하여 뷰의 검색 위치를 무효화해야할까요? –

    답변

    1

    나는 일하면서 찾고있는 것을 얻을 수 있었고 매우 간단하다고 생각합니다!

    나는 BaseController 클래스를 만들었습니다

    public class BaseController : Controller 
    { 
        protected override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
         filterContext.RouteData.DataTokens["area"] = CurrentLayout; 
         base.OnActionExecuting(filterContext); 
        } 
    
        public string CurrentLayout 
        { 
         get 
         { 
          //Set a default layout if no layout is specified 
          if(Session["CurrentLayout"]==null) 
           Session["CurrentLayout"] = "Layout1"; 
          return Session["CurrentLayout"].ToString(); 
         } 
    
         set 
         { 
          if (string.IsNullOrWhiteSpace(value) || string.IsNullOrEmpty(value)) 
           throw new NullReferenceException("CurrentLayout"); 
          CurrentLayout = value; 
         } 
        } 
    } 
    

    그런 다음 세션의 시작에, 나는 사용자의 프로필을 읽고 BaseController가 읽고 세션 변수는 선택한 레이아웃을 넣어.

    그 밖의 것은 필요하지 않습니다.

    다른 사람들에게 도움이되기를 바랍니다.

    감사합니다.