2009-08-06 3 views
0

오랜 질문이 있습니다. 나는 ASP.NET에 상당히 익숙하다. 그래서 나와 함께 견뎌야한다. 몇 가지 옵션이 나열된 ASP.NET 페이지에 대한 컨트롤을 만들었습니다. 각 옵션에는 클릭 가능한 영역이 두 개 있습니다 (간단히하기 위해 버튼이라고 부름). 하나는 옵션을 선택하고 하나는 옵션을 숨 깁니다.ASP.NET 여러 인수가있는 서버 쪽 이벤트 트리거


protected void Page_Load(object sender, EventArgs e) 
{ 
    RenderOptions(); 
} 

public void RenderOptions() 
{ 
    for (int i = 0; i < 5; i++) { 
    HtmlGenericControl div1 = new HtmlGenericControl("div"); 
    div1.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i)); 
    m_TreeContainer.Controls.Add(div1); 

    HtmlGenericControl div2 = new HtmlGenericControl("div"); 
    div2.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i)); 
    m_TreeContainer.Controls.Add(div2); 
    } 
} 

public void RaisePostBackEvent(string arg) 
{ 
    //do something 
} 

잘 작동합니다 (IPostBackEventHandler 인터페이스 구현). 여기서 문제는 어떤 HTML 요소가 클릭되었고 RaisePostBackEvent 메서드에서 어떤 작업을 수행해야 하는지를 찾는 방법이없는 것 같습니다.


class HtmlDivControl : HtmlGenericControl, IPostBackEventHandler 
{ 
    #region Delegates 
    public delegate void ClickEventHandler(object sender, string eventArgument); 
    #endregion 

    #region Properties 
    private ClickEventHandler m_Click; 
    public ClickEventHandler Click 
    { 
    get { return m_Click; } 
    set { m_Click = value; } 
    } 
    #endregion 

    #region Constructors 
    public HtmlDivControl() 
    { 
    } 
    #endregion 

    public void RaisePostBackEvent(string eventArgument) 
    { 
    m_Click.Invoke(this, eventArgument); 
    } 
} 

가 지금은 div1을 만들어 HtmlGenericControl보다는 내 HtmlDivControl을 DIV2, 방법에 클릭하여 속성을 설정 (대표 : 내가해야 할 노력은 무엇

은 다음과 같습니다 새로운 클래스를 (HtmlDivControl) 만드는 것입니다) div (div1 또는 div2) 자체를 GetPostBackEventReference 메서드의 컨트롤로 전달했습니다. 이번에는 div를 구별 할 수있을뿐만 아니라 수행해야 할 작업을 미리 결정할 수있었습니다. 그러나 컨트롤에 대한 RaisePostBackEvent는 PageLoad 후에 호출됩니다. 그래서 지금 문제는 이벤트가 처리되기 전에 전체 옵션 컨트롤이 렌더링된다는 점입니다. 따라서 실제 숨기기가 렌더링 이후에 발생하기 때문에 숨겨져 있어야하는 옵션이 아닙니다. RenderOptions() 호출을 PageLoadComplete 메서드로 이동해도 div 컨트롤이 아직 존재하지 않기 때문에 어느 쪽도 도움이되지 않습니다.

저는 꽤 근본적인 것이 빠져 있다고 확신합니다. 하지만 누군가 내가 어떻게 이런 식으로 접근해야하는지 설명해 주시겠습니까?

p.s. 여기에 밑줄을 쓰려면 어떻게해야합니까? 텍스트를 이탤릭체로 만드는 데 사용됩니까? 이스케이프 문자가 있습니까?

+1

정확히이 컨트롤로 무엇을하려합니까? 내 충고는 ASP.Net을 처음 접한다면 사용자 지정 컨트롤 클래스에서 벗어나는 것입니다. – John

+0

Page_Load는 Microsoft가 내놓은 무언가입니다 :-) 또한, 그 이유는 mangle을 매우 유효한 문자의 사용. 그러나 이것은 완전히 다른 토론입니다. @ 존 : 사용자 지정 컨트롤을 사용하지 않으려면 ASP.NET의 복잡한 측면을 어떻게 배우려고합니까? 명확히하기 위해 ASP.NET이나 프로그래밍 전반에 대한 첫 발걸음을 내디뎠다 고 생각하지 않습니다. 이제는 완전히 익숙하지 않은 영역에 들어가기 시작했습니다. 내가 게시 한 것을 바탕으로 볼 때 나는 잘못된 방향으로 이것을 가져갈 것입니다. 그렇다면 올바른 방법을 가르쳐주십시오. – Jerry

+0

필자가 언급 한 이유는 다른 프로젝트에서이 컨트롤을 다시 사용하지 않는다면 거의 항상 컨트롤이 내장 된 더 간단하고 세련된 솔루션이 있거나 최소한 UserControl을 만드는 것입니다 – John

답변

2

ASP.Net을 처음 사용하는 사람이라면 지금까지 상당히 잘 해왔습니다. 여기에 귀하의 장애물은 실제로 당신이 문제에 대해 생각하는 방식입니다. ASP.Net 페이지 라이프 사이클을 잘 이해해야합니다. 매우 근본적인 것이 빠져 있습니다.

간단히 말해서 페이지가 다시 게시하기 전과 같은 상태로 페이지를 다시 작성하기를 원합니다. 그런 다음 이벤트를 처리하십시오. 그런 다음 상태를 변경하십시오.

당신은 html 컨트롤이 요청 시작시 상태 변경에 대해 알아야하는 것처럼 생각합니다. 이는 틀린 것입니다. 먼저 재건 단계가 있어야합니다. 이는 ASP.Net이 어떤 이벤트를 발생 시킬지 파악하는 데 중요합니다.

내가 추천 할 것입니다 무엇 :

  1. 후 Page_Init 핸들러에 방법 당신의 "() RenderOptions을"이동

    . 이렇게하면 ViewState를 컨트롤에 통합 한 경우 많은 문제가 해결됩니다. (실제로 렌더링하는 것이 아니기 때문에 이름을 바꿀 것입니다. 단지 컨트롤을 페이지에 추가하는 것입니다. 렌더링은 ASP.Net의 특정 컨텍스트를가집니다).

  2. 그런 다음 컨트롤의 OnClick 이벤트 처리기에서 렌더링 방식을 제어하지 않고 필요한 경우 컨트롤 표시 유형을 설정하기 만하면됩니다. 컨트롤이 페이지에 렌더링되는 방식을 변경하려고 시도하는 대신 컨트롤을 Visible = False로 설정하는 것이 항상 인 것이 더 간단합니다.Visible = False로 설정하면 해당 컨트롤의 응답에 0 HTML이 전송되지만 서버는 여전히 페이지에 있음을 알 수 있으므로 여전히 처리 할 수 ​​있습니다.

페이지의 상태를 변경할 위치로 이벤트 핸들러를 생각해보십시오. 이 경우에는 Page_Load가 아닌 논리가 있어야합니다.