2010-05-20 14 views
14

Oto, co usiłuję zrobić: Kliknij przycisk na mojej stronie, co z kolei sprawia, że ​​(2) zdziała:ASP.NET: ModalPopupExtender zapobiega przycisk zdarzenie click z wypalania

  1. obrazu a ModalPopup aby uniemożliwić użytkownikowi naciskając żadnych przycisków lub zmianę wartości
  2. zadzwonić do mojego kodu za metody ukrywania ModalPopup po zakończeniu

Oto znaczników ASP:

<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true" 
    UpdateMode="Always"> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" /> 
    </Triggers> 
    <ContentTemplate> 
     <asp:Panel ID="pnlHidden" runat="server" style="display: none;"> 
      <div> 
      <h1>Saving...</h1> 
      </div> 
     </asp:Panel> 
     <cc1:ModalPopupExtender ID="modalPopup" 
      BackgroundCssClass="modalBackground" runat="server" 
      TargetControlID="btnSaveData" PopupControlID="pnlHidden" 
      BehaviorID="ShowModal"> 
     </cc1:ModalPopupExtender> 
     <asp:Button ID="btnSaveData" runat="server" Text="Save Data" 
      OnClick="btnSaveData_Click" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Teraz tutaj jest mój kod za kod C#:

protected void btnSaveData_Click(object sender, EventArgs e) 
{ 
    UpdateUserData(GetLoggedInUser()); 
    modalPopup.Enabled = false; 
} 

Dlaczego to nie działa? ModalPopup wyświetla się idealnie, ale zdarzenie btnSaveData_Click NIGDY nie jest uruchamiane.

AKTUALIZACJA: Pierwsza sugestia nie działa dla mnie. Wypróbowałem też twoją drugą sugestię (o ile to dotyczyło mnie). Jedną z niewielkich różnic na moim końcu jest to, że nie ma przycisku na moim panelu modalnym (pnlHidden) - to tylko wiadomość. Próbowałem używać zdarzeń JavaScript po stronie klienta, które przynajmniej wystrzeliły równolegle z moim zdarzeniem po stronie serwera. To była dobra wiadomość, ale nie mogę znaleźć ani uchwycić obsługi ModalPopupExtender ani jej BehaviorID. Nie działa:

function showOverlay() { 
    var popup = $find('modalPopup'); 
    popup.show(); 
} 

popup jest ZAWSZE równy zeru.

UPDATE KOŃCOWA: To moje ostateczne rozwiązanie dla coraz to do pracy (Take specyficzną nutę wykorzystania OnClientClick I OnClick):

<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true" 
UpdateMode="Always"> 
<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" /> 
</Triggers> 
<ContentTemplate> 
    <asp:Panel ID="pnlHidden" runat="server" style="display: none;"> 
     <div> 
     <h1>Saving...</h1> 
     </div> 
    </asp:Panel> 
    <cc1:ModalPopupExtender ID="modalPopup" 
     BackgroundCssClass="modalBackground" runat="server" 
     TargetControlID="hdnField" PopupControlID="pnlHidden" 
     BehaviorID="ShowModal"> 
    <asp:HiddenField ID="hdnField" runat="server" /> 
    </cc1:ModalPopupExtender> 
    <asp:Button ID="btnSaveData" runat="server" Text="Save Data" 
     OnClientClick="showModal();" OnClick="btnSaveData_Click" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

użyciem tej funkcji javascript:

function showModal() { $find('ShowModal').show(); } 

... A ten kod:

protected void btnSaveData_Click(object sender, EventArgs e) 
{ 
    UpdateUserData(GetLoggedInUser()); 
    modalPopup.hide(); 
} 

Odpowiedz

14

Wypróbuj .

Tworzenie obojętne ukryte pole:

<asp:HiddenField ID="hdnField" runat="server" /> 

Ustawianie TargetcontrolID = "hdnField" w swojej deklaracji Modal popup.

W wydarzeniu btnSaveData_Click, to zrobić:

modalPopup.Show(); 
+0

Wiesz co jest dziwne, próbowałem dokładnie tę koncepcję, ale z manekina Buttona zamiast HiddenField . To nie zadziałało (z przyciskiem), ale teraz działa z HiddenField. Pytanie uzupełniające: Wyskakujące okno pokazuje moje wywołanie bazy danych, ale metoda modalPopup.Hide() jest wykonywana zbyt szybko, a wszelkie próby spowolnienia nie powodują wyświetlania okienka. Jakieś pomysły na obejście tego problemu? –

+0

Jeśli chcesz po prostu użyć modalnego wyskakującego okna jak na ekranie "ładowanie", proponuję umieścić go w asp: UpdateProgress. Jeśli idzie szybko, to dobrze? Chcesz go szybko. Oczywiście możesz opóźnić cokolwiek, wykonując System.Threading.Thread.Sleep (2000); (2 sekundy). Nie chcę tego robić. –

+0

Próbowałem System.Threading.Thread.Sleep (2000); zanim opublikowałem mój ostatni komentarz, a kiedy to zrobiłem, modal zniknął całkowicie (nigdy nie pojawił się). Spróbuję kontrolki asp: UpdateProgress. –

1

Pierwsza próba: Spróbuj ustawić ButtonID do OkControlID Tag i spróbuj ponownie

LUB

Druga próba: Zadzwoń do zdarzenia ponad JavaScript wydaje się być pewne problemy z wydarzeń click

<div> 
    <cc1:ModalPopupExtender PopupControlID="Panel1" 
     ID="ModalPopupExtender1" 
     runat="server" TargetControlID="LinkButton1" OkControlID="Ok" 
     OnOkScript="__doPostBack('Ok','')"> 
    </cc1:ModalPopupExtender> 
    <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton> 
</div>   

<asp:Panel ID="Panel1" runat="server"> 
    <asp:Button ID="Ok" runat="server" Text="Ok" onclick="Ok_Click" />    
</asp:Panel> 
3

Spróbuj tego.Jest w 100% pracuje

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <asp:Button ID="Btnshow" runat="server" Text="Show" OnClick="Btnshow_Click" /> 
     <asp:Button ID="BtnTarget" runat="server" Text="Target" Style="display: none" /> 
     <asp:TextBox ID="TextBox1" runat="server"> 
     </asp:TextBox> 
     <input type="button" value="Get" onclick="abc()" /> 
     <asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="BtnTarget" 
      PopupControlID="Panel1"> 
     </asp:ModalPopupExtender> 
     <asp:Panel ID="Panel1" runat="server" BackColor="Black" Width="300px" Height="300px"> 
      <asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
       <ContentTemplate> 
        <asp:Button ID="BtnHide" runat="server" Text="Hide Button" OnClick="BtnHide_Click" /> 
       </ContentTemplate> 
       <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="BtnHide" EventName="Click" /> 
       </Triggers> 
      </asp:UpdatePanel> 
     </asp:Panel> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="Btnshow" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 

kodu po stronie serwera

protected void Btnshow_Click(object sender, EventArgs e) 
{ 
    ModalPopupExtender1.Show(); 
} 
protected void BtnHide_Click(object sender, EventArgs e) 
{ 
    ModalPopupExtender1.Hide(); 
} 
1

Z tego przykładu można łatwo kontrolować panelu wyświetlane zależy od warunków, a nie tylko od razu pojawi się panel po kliknięciu przycisku.

<asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click"/> 
<asp:HiddenField ID="hdnField" runat="server" /> 
<ajaxToolkit:ModalPopupExtender runat="server" 
    TargetControlID="hdnField" 
    ID="btnAdd_ModalPopupExtender" 
    PopupControlID="pnlPrintName"> 
</ajaxToolkit:ModalPopupExtender> 
<asp:Panel ID="pnlPrintName" runat="server"> 
. 
. 
</asp:Panel> 

//Server side code: 
protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    if(dt.Rows.Count == 0) 
    { 
    btnAdd_ModalPopupExtender.Show(); 
    } 
    else 
    { 
    add(); 
    } 
} 
1

W kodzie tyłu, można to zrobić:

if (true) 
{ 
    var script = @"Sys.Application.add_load(function() { $find('behavoirIDModal').show(); });"; 
    ScriptManager.RegisterStartupScript(this, GetType(), "Show", script, true); 
} 

to zmienić „behavoirIDModal”

Powiązane problemy