2012-08-13 6 views
1

내가 문제 하나 ModalPopupExtender를 숨기고 같은 서버 측 호출 내에서 다른보기를 데에서 순차적으로 열기/닫기 ASP.Net 아약스 ModalPopupExtenders을 수행 할 수 없습니다.은 서버 측 코드

내 응용 프로그램은 일부 유효 조건에서 사용자 입력이 필요합니다. 이러한 조건은 순서대로 평가되며 특정 조건이 충족되면 ModalPopupExtender 창을 통해 사용자가 확인 (예 또는 아니오 클릭)해야합니다. 사용자가 예를 클릭하면 평가를 계속해야하며 다른 조건에 사용자 입력이 필요한 경우 모든 조건이 통과 될 때까지 모달 대화 상자를 열어야합니다. 조건 중 하나만 입력이 필요하지만, 더 이상의 입력이 필요한 경우, 첫 번째 모달가 표시되고 나는 이유를 알아낼 수없는 경우

나는 아무 문제가있어. 코드를 추적 할 때 첫 번째 팝업의 Hide()가 눌리고 두 번째 팝업의 Show()가 눌려 지지만 두 번째 팝업이 나타나지 않는다는 것이 분명합니다.

극단적 인 단순화와 관련하여 여기서 관련 코드 블록을 추출하려고했습니다. 정말 복잡한 프로젝트이고 뭔가 놓쳤을 지 모르지만 제 문제를 설명하기에 충분하길 바랍니다.

문제적인 프로세스 흐름 : 예 "

  • 사용자 클릭> 사용자로 돌아 가기 -> 첫 번째 모달 팝업보기 - -> DoContinue를 호출 -> 설정 상태 플래그를

    1. 사용자는"계속 "을 클릭 "-> 호출 조건 1 예 클릭 처리기 (처리 된 플래그 설정, 모달 팝업 숨기기) -> DoContinue-> 조건 플래그 재검색 -> 두 번째 모달 팝업 표시 시도 -> 사용자에게 반환.

    첫 번째 팝업은 사라지지만 두 번째 팝업은 표시되지 않습니다.

    은 숨기기가() 표시()가 두 번째 호출되고 같은 요청의 첫 번째 모달 호출되고있는 문제는있다.

    MyContainerControl.ascx :

    <%@ Control Language="C#" AutoEventWireup="true" Inherits="MyContainerControl" %> 
    <input Type="Submit" 
          id="btnContinue" 
          Name="btnContinue" 
          Value="Continue" 
          OnServerClick="Continue_Click" 
          runat="server"/> 
    
    <asp:UpdatePanel 
         ID="updateCondition1" 
         runat="server" 
         ChildrenAsTriggers="false" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <ajaxToolkit:ModalPopupExtender 
            ID="modalCondition1" 
            runat="server" 
            BehaviorID="dlgCondition1" 
            TargetControlID="btnFakeInvokeModalCondition1" 
            PopupControlID="divCondition1" 
            BackgroundCssClass="modalBackground" 
            DropShadow="true" 
            PopupDragHandleControlID="divDragCondition1" 
            RepositionMode="RepositionOnWindowResize" 
            CancelControlID="btnCondition1No" /> 
         <input type="button" 
             id="btnFakeInvokeModalCondition1" 
             runat="server" 
             style="display: none" /> 
         <div id="divCondition1" 
           runat="server" 
           class="modalPopup"> 
          <custom:Condition1Control id="condition1" runat="server" visible="false" /> 
          <div id="divDragCondition1"></div> 
         </div> 
        </ContentTemplate> 
    </asp:UpdatePanel> 
    <asp:UpdatePanel 
         ID="updateCondition2" 
         runat="server" 
         ChildrenAsTriggers="false" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <ajaxToolkit:ModalPopupExtender 
            ID="modalCondition2" 
            runat="server" 
            BehaviorID="dlgCondition2" 
            TargetControlID="btnFakeInvokeModalCondition2" 
            PopupControlID="divCondition2" 
            BackgroundCssClass="modalBackground" 
            DropShadow="true" 
            PopupDragHandleControlID="divDragCondition2" 
            RepositionMode="RepositionOnWindowResize" 
            CancelControlID="btnCondition2No" /> 
         <input type="button" 
             id="btnFakeInvokeModalCondition2" 
             runat="server" 
             style="display: none" /> 
         <div id="divCondition2" 
           runat="server" 
           class="modalPopup"> 
          <custom:Condition2Control id="condition2" runat="server" visible="false" /> 
          <div id="divDragCondition2"></div> 
         </div> 
        </ContentTemplate> 
    </asp:UpdatePanel> 
    

    MyContainerControl.cs :

    public class MyContainerControl : System.Web.UI.UserControl 
    { 
        protected HtmlInputImage btnContinue; 
    
        //Condition1 
        protected AjaxControlToolkit.ModalPopupExtender modalCondition1; 
        protected UpdatePanel updateCondition1; 
        protected HtmlGenericControl divCondition1; 
        protected Condition1Control condition1; 
    
        //Condition2 
        protected AjaxControlToolkit.ModalPopupExtender modalCondition2; 
        protected UpdatePanel updateCondition2; 
        protected HtmlGenericControl divCondition2; 
        protected Condition2Control condition2;   
    
        protected override void OnInit(EventArgs e) 
        { 
         base.OnInit(e); 
         condition1.Condition1RaisedEvent += HandleCondition1Event; 
         condition2.Condition2RaisedEvent += HandleCondition2Event; 
         btnContinue.ServerClick += btnContinue_ServerClick; 
        } 
    
        protected void HandleCondition1Event(object sender, Condition1EventArgs e) 
        { 
         // use ship to store 
         ViewState["Condition1Yes"] = true; 
         ViewState["Condition1Value"] = e.Condition1Value; 
         modalCondition1.Hide(); 
         DoContinue(sender); 
        } 
    
        protected void HandleCondition2Event(object sender, Condition2EventArgs e) 
        { 
         // use ship to store 
         ViewState["Condition2Yes"] = true; 
         ViewState["Condition2Value"] = e.Condition2Value; 
         modalCondition2.Hide(); 
         DoContinue(sender); 
        } 
    
        protected void btnContinue_ServerClick(object sender, EventArgs e) 
        { 
         DoContinue(sender); 
        } 
    
        protected void DoContinue(object sender) 
        { 
         // test for conditions - just plug to true for demonstration 
    
         bool throwCondition1 !(ViewState["Condition1Yes"] == null ? false : (bool)ViewState["Condition1Yes"]) 
         bool throwCondition2 = !(ViewState["Condition2Yes"] == null ? false : (bool)ViewState["Condition2Yes"]) 
    
         // analyze conditions 
    
         if (throwCondition1) 
         { 
          var condition1Yes = ViewState["Condition1Yes"] == null ? false : (bool)ViewState["Condition1Yes"]; 
          if (!condition1Yes) 
          { 
           divCondition1.Visible = true; 
           modalCondition1.Show(); 
           return; 
          } 
         } 
    
         if (throwCondition2) 
         { 
          var condition2Yes = ViewState["Condition2Yes"] == null ? false : (bool)ViewState["Condition2Yes"]; 
          if (!condition2Yes) 
          { 
           divCondition2.Visible = true; 
           modalCondition1.Show(); 
           return; 
          } 
         } 
    
         // do other work 
        } 
    } 
    

    Condition1UI.ascx - Condition2UI.ascx 매우 유사합니다

    <%@ Control Language="C#" AutoEventWireup="true" Inherits="Condition1Control" %> 
    <div id="divCondition1Container" runat="server">   
        <input id="hdnCondition1Value" type="hidden" runat="server" value="<%# this.Condition1Value %>" /> 
        <asp:Panel ID="pnlCondition1UI" runat="server"> 
         <br /> 
         <h2> 
          Warning!</h2> 
         <hr /> 
         <br /> 
         <div> 
          <p>Condition1 has been met.</p> 
          <br /> 
          <br /> 
          <p>Would you like to continue?</p> 
         </div> 
         <br /> 
         <br /> 
        </asp:Panel> 
        <div> 
        <table> 
         <tr> 
          <td align="center"> 
           <asp:Button ID="btnCondition1Yes" runat="server" class="green" Text="Yes" style="padding: 3px 7px;" OnClick="DoCondition1YesClick" OnClientClick="$find('dlgCondition1').hide();" /> 
          </td> 
          <td align="center"> 
           <button id="btnCondition1No" class="red">No</button> 
          </td> 
         </tr> 
        </table> 
         <br /> 
        </div> 
        <br /> 
    </div> 
    

    Condition1Control.cs - Condition2Control합니다. CS는 거의 동일합니다.

    public class Condition1EventArgs : EventArgs 
    { 
        public string Condition1Value { get; set; } 
    } 
    
    public class Condition1Control : System.Web.UI.UserControl 
    { 
        public HtmlInputHidden Condition1Value; 
    
        public event EventHandler<Condition1EventArgs> Condition1RaisedEvent; 
    
        protected virtual void RaiseCondition1Event(Condition1EventArgs e) 
        { 
         EventHandler<Condition1EventArgs> handler = Condition1RaisedEvent; 
    
         if (handler == null) 
         { 
          return; 
         } 
    
         handler(this, e); 
        } 
    
        public void DoCondition1ButtonYesClick(object sender, EventArgs e) 
        { 
         RaiseCondition1Event(new Condition1EventArgs{ 
          Condition1Value = Condition1Value.Value 
         }); 
        } 
    } 
    
  • 답변

    2

    변경 UpdatePanel의 UpdateMode를 속성은 "항상"또는 다른 UpdatePanel에서 해고 게시의 결과로 업데이트 할 UI UpdatePanel의 '업데이트'메서드를 호출하는 것을 잊지 마세요합니다. 따라서 코드에서 modalCondition2.Show 메서드 다음에 updateCondition2.Update 메서드 호출을 추가하십시오.

    +0

    매력처럼 작동했습니다! 이 Yuriy에 대해 수천 번 감사드립니다. –