2012-08-17 5 views
1

확인 마스터를 상속받은 마스터 페이지와 중첩 된 마스터 페이지가 있습니다.중첩 된 마스터 페이지의 마스터 설정

MasterPage 
    --> NestedMaster 
      --> Page1 
      --> Page2 
      --> etc. 

그래서 내가 동적으로 최고 수준의 마스터 페이지를 설정해야합니다

모든 페이지는 중첩 된 마스터 페이지를 구현합니다. 머리글과 머리글에서만 완전히 다른 레이아웃을 가진 2 개의 사이트.

코드에서 어떻게 제어 할 수 있습니까? 이벤트 hierachy에서 보았지만 이것은 단지 페이지 수준에있는 마스터 페이지를 설정할 수 있다고 말합니다. 수천 페이지가 있습니다! 이것은 실제적이지 않습니다.

페이지 레벨 및 해당 레벨에서만 NestedMaster에서 한 번만 변경하고 싶습니다. 이 작업을 수행 할 수 있습니까?

protected override void OnInit(EventArgs e) 
{ 
    this.MasterPageFile = getMasterPath(); 
    base.OnInit(e); 
} 

하지만 난 그냥 얻을 :

는 내가 해봤

'MasterPageFile'속성 만 또는 'Page_PreInit'이벤트 전에 설정할 수 있습니다.

마스터 페이지에는 아무런 문제없이 PreInit 이벤트가 없습니다!

답변

0

좀 더 인터넷 검색을 한 결과, 기본 클래스가 Page이기 때문에 가능하지 않다는 것을 깨달았습니다. 이것은 가장 먼저 호출 된 것이므로 PreInit을 지정할 수있는 유일한 장소입니다. 하나님, 나는 웹 폼이 싫어.

그렇다면 나는 http://odetocode.com/Articles/450.aspx에서 해결책을 얻었다고 말했습니다. 기본적으로 사용자 정의 HTTPModule을 생성하십시오.

using System; 
using System.Web; 
using System.Web.UI; 

public class MasterPageModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); 
    } 

    void context_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     Page page = HttpContext.Current.CurrentHandler as Page; 
     if (page != null) 
     { 
      page.PreInit +=new EventHandler(page_PreInit); 
     } 
    } 

    void page_PreInit(object sender, EventArgs e) 
    { 
     Page page = sender as Page; 
     if (page != null) 
     { 
      page.MasterPageFile = "~/Master1.master"; 
     } 
    } 

    public void Dispose() 
    { 
    } 
} 
관련 문제