2010-03-10 4 views
0

가능한 한 자세한 설명을하려고합니다. 우리는 작동중인 코드를 가지고 있으며, 변경되지 않고 현재는 그렇지 않습니다. 나는이 문제를 분리 했으므로 여기에 상황이있다 :ASP에서 이상한 새 오류 : Panel/UserControl/UpdatePanel 조합

우리는 ASPX 페이지를 가지고 있으며, 거기에 2 개의 ASP : 패널 컨트롤 (Panel1과 Panel2)이있다. 이러한 각 패널에는 단일 WebUserControl이 있습니다 (Panel1에는 UserControl1, Panel2에는 UserControl2가 있음). 이 페이지에는 AJAX 툴킷 Scriptmanager가 있습니다. 그게 전부입니다. 사용자가 처음으로 페이지를 방문하면 Panel1이 표시되고 Panel2는 숨겨집니다.

UserControl1에는 asp : Panel, asp : UpdatePanel이 포함 된 asp : Label이 있으며 그 안에 asp : Button이 있습니다. 코드 숨김에는 대리자와 이벤트를 발생시키는 이벤트가 있습니다. 이벤트를 발생시키는 버튼을 클릭하면됩니다. UserControl이 포함 된 ASPX 페이지에서이 이벤트에 대한 처리기가 있습니다. UpdatePanel, ASP : 패널 및 ASP : 라벨 영문 페이지 그래서

, 당신이 UserControl1에있는 버튼을 클릭하면 이벤트가 처리됩니다 Panel2에서

는 ASP있다. 이 이벤트 핸들러는 Panel1을 숨기고 Panel2를 표시합니다. 적어도 USED가 일어나는 것이지만, 지금은 일어나지 않습니다.

요약하면 - ASPX 페이지는 첫 번째 방문에서 Panel1과 UserControl1을 보여줍니다. UserControl1에는 버튼이 있습니다.이 버튼을 클릭하면 ASPX 페이지에서 이벤트가 발생하고, Panel1을 숨기고 Panel2를 표시합니다.

UserControl1 및 UserControl2에서 UpdatePanels를 제거하면 코드가 작동합니다.

분명히 우리의 '실제 생활'코드는 더 복잡합니다. 그러나이 작은 예제는 문제가 어디에 있는지를 보여줍니다.

답변

1

귀하의 버튼은 여전히 ​​업데이트 패널 내에 있으며, 3.5로 설정하면 업데이트 패널은 알림을 표시하지 않는 한 트리거를 내부 이벤트로 처리합니다. 이것은 가장 확실한 것은 3.0에서 사용 가능한 것으로부터의 변화이지만 3.5가 사용 가능해 졌기 때문에 변경되지 않았습니다. 적어도 내가 알고있는 것은 아닙니다.

귀하의 페이지에서 수행 한 작업은 UpdatePanel의 부분 렌더링의 일부로 버튼을 실행하는 것입니다. 부분적으로 만 렌더링되었으므로 UpdatePanel 내부의 내용 만 업데이트되고 페이지 논리는 UpdatePanel 내부에 있지 않습니다.

<Triggers> 
    <asp:PostBackTrigger ControlID="buttonNext" /> 
</Triggers> 

이 다시 게시물을하도록 강제하고 표시하는 두 번째 패널을 얻을 것이다 :

는이 문제를 해결하려면, 당신이해야 할 모든 당신의 UpdatePanel에이 코드를 추가합니다.

+0

감사합니다 찰스 - 나는 이것에 대한 질문이 있습니다. UpdatePanel이 이벤트를 트리거로 처리하지 않으면 디버그에서 코드 샘플을 단계별로 실행할 때 왜 DetailsChanged 이벤트가 발생하고 Default.aspx.cs 내에서 코드가 testUserControl1_DetailsChanged 이벤트 처리기 메서드를 통해 실행됩니까? –

2

http://test.wikisaber.es/testajax.zip 만 업데이트 패널의 내용이 업데이트됩니다

다음은 문제를 포함하는 ZIP입니다. 따라서 panel1과 panel2에서 업데이트 패널을 제거한 다음 panel1과 panel2를 동일한 업데이트 패널에 배치해야합니다.

편집 : 샘플에서 우리는 우리가 뭔가를 얻을 TestUserControl1을 포함하도록하고 default.aspx를 확장하는 경우 :

  <asp:Panel ID="panelUC1" runat="server" Visible="false"> 
      <asp:Panel ID="panelUC1" runat="server"> 
       <div> 
       <asp:Label ID="Label1" runat="server" Text="User Control 1...." /> 
       </div> 
      <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional"> 
       <ContentTemplate> 
        <!-- only the content in from here --> 
        <div> 
         <asp:Button ID="buttonNext" runat="server" OnClick="buttonNext_Click" Text="Click" /> 
        </div> 
        <!-- to here will change when you click on buttonNext -->      
       </ContentTemplate> 
      </asp:UpdatePanel> 
      </asp:Panel> 
     </asp:Panel> 

     <asp:Panel ID="panelUC2" runat="server" Visible="false"> 
      <tuc2:testUserControl2 ID="testUserControl2" runat="server" /> 
     </asp:Panel> 

당신이 buttonNext를 클릭하면 페이지가 다시 게시 및 전체 asp.net 라이프 사이클 throught를 갈 것입니다, 그러나 업데이트 패널을 제어하는 ​​javascript는 브라우저에 이미있는 dom에 요청한 업데이트 패널의 contenttemplate에 대한 변경 사항을 적용합니다. click 이벤트에서 buttonNext 텍스트를 재설정하고 내가 말하려고하는 것을 확인하십시오.

이 기사는 업데이트 패널 및 사용자 정의 컨트롤에서 http://msdn.microsoft.com/en-us/library/Bb398780(en-us,VS.90).aspx입니다.

+0

감사합니다. Dug이지만 ASPX 페이지에는 UpdatePanel이없고 UserControls에만 있습니다. 코드 샘플을 살펴보십시오. –

+0

업데이트 패널을 사용하면 부분 페이지 렌더링을 수행 할 수 있으며 제출하는 업데이트 패널의 내용에 대한 변경 사항 만 표시합니다. 따라서 코드 샘플의 사용자 정의 컨트롤에서 업데이트 패널을 제거하고 사용자 정의 컨트롤을 둘러싼 업데이트 패널을 default.aspx 페이지에 추가하면 두 번째 사용자 정의 컨트롤에 레이블 텍스트가 예상대로 표시됩니다. – Dug

+0

원래 게시물 Dug에서 말했듯이 : "UserControl1과 UserControl2에서 UpdatePanels를 제거하면 코드가 작동합니다." 이 정도는 알고 있습니다. 작업에 사용 된 코드입니다. 나는 지금까지 왜 그렇게되지 않는지 알아보고자한다. 왜냐하면 코드에 아무런 문제가 없다고 말할 수 있고 완벽하게 작동해야하기 때문이다. –