2010-05-20 60 views
14

Aquí es lo que estoy tratando de hacer: Haga clic en un botón en mi página, que a su vez hace (2) cosas suceden:ASP.NET: ModalPopupExtender impide evento de clic de botón de disparar

  1. Mostrar una ModalPopup para evitar que el usuario pulsa ningún botón ni el cambio de valores
  2. Llama a mi código detrás método, ocultando la ModalPopup cuando termine

Aquí está el marcado 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> 

Ahora, aquí está mi código detrás de código C#:

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

Por qué no funciona? ModalPopup se muestra perfectamente, pero el evento btnSaveData_Click NUNCA se activa.

ACTUALIZACIÓN: La primera sugerencia no funcionó para mí. También probé tu segunda sugerencia (en la medida en que se aplica a mí). Una pequeña diferencia en mi parte es que no hay ningún botón en mi panel modal (pnlHidden); es solo un mensaje. Intenté usar eventos de Javascript en el lado del cliente, que al menos se activaron simultáneamente con mi evento del lado del servidor. Esta fue una buena noticia, pero parece que no puedo encontrar ni manejar un ModalPopupExtender o su BehaviorID. Esto no funciona:

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

emergente SIEMPRE equivale a nulo.

INFORME FINAL DE ACTUALIZACIÓN: Esta es mi solución final para conseguir que esto funcione (Tomar nota específica del uso de OnClientClick Y 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> 

Con esta función Javascript:

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

... Y este código detrás:

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

Respuesta

14

Prueba esto .

crear un campo oculto dummy:

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

Ajuste el TargetControlID = "hdnField" en su declaración modal emergente.

En su caso btnSaveData_Click, haga lo siguiente:

modalPopup.Show(); 
+0

Usted sabe lo que es raro, lo trató este concepto exacto, pero con un botón ficticia en lugar de un HiddenField . Eso no funcionó (con el botón), pero ahora sí funciona con un HiddenField. Pregunta de seguimiento sin embargo: la ventana emergente muestra que mi llamada a la base de datos está hecha, pero modalPopup.Hide() se ejecuta demasiado rápido, y cualquier intento de ralentizarlo resulta en que no se muestre la ventana emergente. ¿Alguna idea para una solución alternativa? –

+0

Si solo quiere usar un menú emergente modal como una pantalla de "carga", le sugiero ponerlo en el asp: UpdateProgress. Si va rápido, está bien ¿no? Quieres que vaya rápido. Por supuesto, puede retrasar cualquier cosa haciendo System.Threading.Thread.Sleep (2000); (2 segundos). Definitivamente no recomiendo hacer eso. –

+0

Probé el System.Threading.Thread.Sleep (2000); antes de publicar mi último comentario, y cuando lo hice, el modal desapareció por completo (nunca apareció). Probaré el asp: control UpdateProgress. –

1

Primer intento: tratar de establecer su ButtonID en Tag OkControlID y vuelve a intentarlo

O

Segundo intento: Llame a su evento durante Javascript parece que hay algunos problemas con los eventos de clic

<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

probar esto.Es 100% trabajando

<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> 

código del lado del servidor

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

De este ejemplo se puede controlar fácilmente la demostración del panel hacia arriba depende de las condiciones en lugar de sólo mostrar inmediatamente panel hacia arriba una vez que haga clic en el botón.

<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

En código detrás, usted puede hacer esto:

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

Cambie este 'behavoirIDModal'

Cuestiones relacionadas