2013-01-17 3 views
1

컨트롤 클래스 (표준)에서 동적으로로드되는 다른 사용자 컨트롤 (헤더) 내에 중첩 된 사용자 컨트롤 (탐색)이 있습니다.ASP.NET의 사용자 컨트롤에 이벤트 전파

사용자 컨트롤, 탐색 및 머리글에는 AutoEventWireup = false가 있습니다.

제어 클래스 표준 호출은 구성 항목에서 Header 사용자 정의 컨트롤을로드합니다.

private void layoutAndRender(HtmlTextWriter output, string UserControlKey, NameValueCollection UserControlsConfiguration) 
{ 
    if(UserControlsConfiguration[UserControlKey] != null && UserControlsConfiguration[UserControlKey].ToString() != "") 
    { 
     string suc = System.Web.HttpContext.Current.Request.ApplicationPath + UserControlsConfiguration[UserControlKey].ToString(); 
     UserControl ucToRender = (UserControl)this.Page.LoadControl(suc); 
     ucToRender.RenderControl(output); 
    } 
} 

내 문제는 내가 Page.Request 및 Page.Response을 수용 할 수있는 탐색 사용자 컨트롤의 객체를 초기화 할 것인지, 그러나 사건 뒤에 탐색 코드에서 발사 될 것 같지 않습니다.

this.browser = new Browser(this.Request, this.Response); 

내가 탐색 생성자 동안이 일을 시도했지만 this.Request 및 this.Response는 그 시간에 설정되지 않습니다

내 객체를 초기화하는 데 사용하고 코드입니다.

void Page_Load(object sender, System.EventArgs e) 메서드의 문을 사용하여 시도했지만 탐색 생성자에 this.Load += new System.EventHandler(this.Page_Load);이 있어도 실행되지 않는 것 같습니다.

Page_Init 및 Page_PreRender에 대해서도 유사한 문구를 사용해 보았지만이 중 아무 것도 실행되지 않는 것 같습니다.

LoadControl과 함께로드 된 컨트롤이 Load 또는 Init 이벤트를 발생시키지 않습니까?로드 한 방식으로로드되면 포함될 수있는 모든 사용자 정의 컨트롤에 적용됩니까? AutoEventWireup가로드 할 컨트롤 false로 설정되어

+0

어디에서 온 'layoutAndRender' 메서드는 무엇입니까? – rsbarro

+0

Control 클래스 Standard 내에서 호출됩니다. 불행히도, 이것은 레거시 코드이며, 항상 올바른 방법으로 수행되지는 않습니다. – Reuben

+0

좀 더 구체적으로 알려주시겠습니까? 'LayoutAndRender'는'Standard'의'Page_Load' 메쏘드에서 호출 되었습니까? 아니면'Render' 메쏘드 같은 다른 곳에서 왔습니까? – rsbarro

답변

0

불행하게도,이 레거시 코드이며, 항상 올바른 방법으로하지.

특히, 사용자 정의 컨트롤이 수동으로로드되고 렌더링되기 때문에 대부분의 이벤트 모델을 건너 뛰었을 것입니다. 이상적으로는 컨트롤을 HtmlTextWriter로 렌더링하는 대신 페이지에 AddControl()을 수행해야합니다.

제 생각에는 RenderControl 메서드를 재정의하고속성을 초기화하여 체인 위로 RenderControl을 전달해야합니다.

1

경우에, 당신은 컨트롤의 Load 이벤트 핸들러를 연결할 수있는 OnInit 메소드를 오버라이드 (override)합니다. RequestResponse 속성은 Page_Load에서 사용할 수 있어야합니다. 예를 들어

:

public class Header : Control 
{ 
    private void Page_Load(object sender, EventArgs e) 
    { 
    } 

    override protected void OnInit(EventArgs e) 
    { 
     this.Load += new System.EventHandler(this.Page_Load); 
    } 
} 

AutoEventWireup에 대한 추가 정보를 원하시면 MSDN을 참조하십시오 http://support.microsoft.com/kb/324151