2009-02-20 17 views
27

Ho creato un modulo modale jQuery UI e desidero che tale modulo attivi un postback, ma ho difficoltà a farlo funzionare.jQuery form modal problemi di postback della finestra di dialogo

So che ci sono alcuni articoli basati sull'uso del plugin SimpleModal, e ho provato ad adattare questi e sovrascrivere la funzione _doPostback, ma senza gioia.

Penso che il problema sia nella chiamata alla mia funzione __doPostBack e quali dovrebbero essere i parametri. È questo il caso?

Ecco la mia forma

<form id="summaryForm" runat="server"> 
    <div id="dialog" title="Quick Booking"> 
     <p>Select user from list or enter name in box</p> 
     <fieldset> 
      <p><label>Is machine going out of the office?</label></p> 
      <asp:RadioButton TextAlign="Left" GroupName="outOfOffice" Text="Yes" ID="optYes" class="radio" runat="server" /> 
      <asp:RadioButton TextAlign="Left" GroupName="outOfOffice" Text="No" ID="optNo" class="radio" runat="server" Checked="true" /> 

      <label for="dropLstUser">User:</label> 
      <asp:DropDownList ID="dropLstUser" runat="server" /> 
      <input type="text" name="txtUser" id="txtUser" value="" class="text" /> 
      <label for="txtStartDate">Start Date:</label> 
      <input type="text" id="txtStartDate" name="txtStartDate" class="datepicker" /> 
      <asp:HiddenField ID="assetField" runat="server" /> 
      <%--<button onclick="performPostBack('summaryForm')">Postback</button>--%> 
     </fieldset> 
    </div> 
    //-------------------------------- 

Ecco il codice JavaScript:

<script type="text/javascript"> 
    $(function() { 
     $("#dialog").dialog({ 
      bgiframe: true, 
      height: 300, 
      modal: true, 
      buttons: { 
       'Close': function() { 
          alert("closing"); 
          $(this).dialog("close"); 
          __doPostBack = newDoPostBack; 
          __doPostBack("aspnetForm",null); 
         } 
      } 
     }); 
    }); 

    function newDoPostBack(eventTarget, eventArgument) 
    { 
     alert("postingback"); 
     var theForm = document.forms[0]; 

     if (!theForm) 
     { 
      theForm = document.aspnetForm; 
     } 

     if (!theForm.onsubmit || (theForm.onsubmit() != false)) 
     { 
      document.getElementById("__EVENTTARGET").value = eventTarget; 
      document.getElementById("__EVENTARGUMENT").value = eventArgument; 
      theForm.submit(); 
     } 
    } 
</script> 

risposta

0
'Close': function() { 
      alert("closing"); 
      $(this).dialog("close"); 
      __doPostBack = newDoPostBack; 
      __doPostBack("aspnetForm", null); 
     }}});}); 

La funzione __doPostBack prende il controllo, che è causa il postback e un argomento, se necessario. I tuoi esempi JavaScript e il tuo markup non sembrano corrispondere. Ad esempio, dove ho citato sopra, si fa riferimento a aspnetform, si modifica l'ID del modulo e si riprova.

Assicurarsi che l'ID utilizzato per lo script client sia lo stesso dell'ID client del controllo ASP.NET in fase di esecuzione. Se un controllo risiede in un INamingContainer, allora avrà un id univoco basato sul suo contenitore genitore, quindi YourControlID diventerà YourINaminContainerID_YourControlID.

Fateci sapere il risultato.

+0

Il motivo per cui impostare l'ID per aspnetForm era perché ho provato ad utilizzare il vero nome del modulo - summaryForm e la mia Firebug JavaScript debugger detto __EVENTTARGET era nullo. Ho esaminato la fonte e ho notato che asp.net cambia l'id del clientide in aspnetForm - ancora __EVENTTARGET è nullo ......... – mancmanomyst

+0

è il controllo che causa il postback del modulo stesso o del pulsante? In questa istanza è una finestra di dialogo modale quindi non c'è alcun pulsante di invio.Ho provato ad aggiungere il mio pulsante di invio invece di sovrascrivere uno dei pulsanti generati da jQuery, ma anche questo non ha funzionato. – mancmanomyst

0

Sono riuscito a risolvere il problema, probabilmente non il modo migliore, ma ecco quello che ho fatto.

La finestra di dialogo non viene postback poiché jQuery UI estrae il modulo di invio dal modulo e lo aggiunge alla parte inferiore del tag del corpo, quindi quando si tenta di postback del pulsante non sa cosa sta postando.

ho avuto intorno a questo modificando il codice jQuery UI modificando questo:

uiDialog = (this.uiDialog = $('<div/>')) 
       .appendTo(document.body) 
       .hide() 
       .addClass(
         'ui-dialog ' + 
         'ui-widget ' + 
         'ui-widget-content ' + 
         'ui-corner-all ' + 
         options.dialogClass 
       ) 

A tal:

uiDialog = (this.uiDialog = $('<div/>')) 
       .appendTo(document.forms[0]) 
       .hide() 
       .addClass(
         'ui-dialog ' + 
         'ui-widget ' + 
         'ui-widget-content ' + 
         'ui-corner-all ' + 
         options.dialogClass 
       ) 

E non è l'ideale per modificare la libreria di origine, ma è meglio di niente .

1

Una trucco sfacciato che ho usato è quello di creare un normale pulsante .NET con caselle di testo, ecc all'interno di un div sulla pagina, utilizzando jQuery ottenere il HTML per questo div, aggiungerlo alla finestra di dialogo, e quindi rimuovere il codice HTML all'interno del div originale per evitare la duplicazione dell'ID.

<div id="someDiv" style="display: none"> 
    <p>A standard set of .net controls</p> 
    <asp:TextBox ID="textBoxl" runat="server" CssClass="required email"></asp:TextBox> 
    <input id="button1" type="button" value="Confirm" onclick="SomeEvent();" /> 
</div> 

e lo script:

var html = $("#someDiv").html(); 
$("#dialog").append(html); 
$("#someDiv").remove(); 
$("#dialog").dialog({ 
     bgiframe: true, 
     height: 300, 
     modal: true 
}); 
69

Dopo aver creato il vostro dialogo è sufficiente spostare la finestra nuovamente al suo modulo. Esempio:

$("#divSaveAs").dialog({bgiframe:false, 
          autoOpen:false, 
          title:"Save As", 
          modal:true}); 
    $("#divSaveAs").parent().appendTo($("form:first")); 

Questo ha funzionato per me. Trovati lavori di postback.

+1

Dopo aver lottato con questo problema per tutta la mattinata, mi sono imbattuto in questo e funziona benissimo. Mi piacciono le correzioni di 1 riga. – hacker

+0

Questo ha funzionato anche per me. Grazie! –

+0

Grazie per questo. Mi ha salvato un sacco di dolore – AJM

1

Mille grazie per il post di csharpdev! Il codice seguente ha fatto per la mia pagina:

$("#photouploadbox").dialog({ 
    autoOpen: false, 
    modal: true, 
    buttons: { "Ok": function() { $(this).dialog("close"); } }, 
    draggable: false, 
    minWidth: 400 }); 

$("#photouploadbox").parent().appendTo($("form#profilform")); 
0

posso ottenere questo lavoro se ho uno di ciascuno. Un div, uno script e un link. Nel mio caso, la finestra di dialogo consente all'utente di lasciare una "nota" per ogni record del database. Non ho alcun pulsante nella mia finestra di dialogo, solo l'impostazione predefinita in alto a destra "x" per chiudere la finestra di dialogo.

Ma sto cercando di farlo funzionare all'interno di un ciclo di query ColdFusion. Più record, ognuno con il proprio pulsante di dialogo, script associato e div. Sto cambiando gli ID in modo dinamico in modo che siano tutti unici (ovvero aggiungendo un _XX dove XX è la chiave primaria del record per tutti gli ID).

Quando si espande questo modello, con più finestre di dialogo, script, div .. Se apro ogni finestra di dialogo per modificare la "nota" corrispondente per quel record, salverà solo l'ULTIMO. Dovrei fare il .parent(). AppendTo su un pulsante clicca contro automaticamente? Da qualche parte si sta confondendo.

Se non apro nessuna finestra di dialogo (non apportare modifiche tramite la finestra di dialogo) ed eseguo un dump sui risultati del modulo, vedo tutti i campi di dialogo che arrivano sul post come previsto.

Quando guardo l'HTML grezzo prodotto ... Tutti gli ID sono unici e sono chiamati in modo appropriato. Stavo pensando che stavo per avere collisioni su un nome/id conflittuale da qualche parte, ma sembra tutto a posto.

Il mio script:

<script type="text/javascript"> 
    // Increase the default animation speed to exaggerate the effect 
    $.fx.speeds._default = 1000; 
    $(function() { 
     $("##dialog#getALLFacilityEquipOrders.order_id#").dialog({ 
      autoOpen: false, 
      show: "blind", 
      hide: "explode", 
      width: 500, 
      resizable: false 
     }); 

     $('.countable2').jqEasyCounter({ 
      'maxChars': 2000, 
     }); 

     // Dialog Link 
     $('##dialog_link#getALLFacilityEquipOrders.order_id#').click(function(){ 
      $('##dialog#getALLFacilityEquipOrders.order_id#').dialog('open'); 
      return false; 
     }); 

     //hover states on the static widgets 
     $('##dialog_link#getALLFacilityEquipOrders.order_id#, ul##icons li').hover(
      function() { $(this).addClass('ui-state-hover'); }, 
      function() { $(this).removeClass('ui-state-hover'); } 
     ); 

     $("##dialog#getALLFacilityEquipOrders.order_id#").parent().appendTo($("form##allequipedit")); 
    }); 
</script> 

mio div:

<div id="dialog#getALLFacilityEquipOrders.order_id#" 
    title="Notes For #getALLFacilityEquipOrders.cLicenseNumber# - Order ID: ORD-#getALLFacilityEquipOrders.order_id#" 
    style="display:none;"> 

    <cfquery datasource="#a_dsn#" name="getOrderNotes"> 
     select notebody 
     from QIP_EquipOrders_Notes 
     where fk_order_id = #getALLFacilityEquipOrders.order_id# 
    </cfquery> 
    <fieldset class="qip_menu"> 
     <label><b>Enter/Edit Notes:</b></label> 
     <textarea class="countable2" 
        id="notebody_#getALLFacilityEquipOrders.order_id#" 
        name="notebody_#getALLFacilityEquipOrders.order_id#" 
        rows="10" 
        cols="75">#getOrderNotes.notebody#</textarea> 
    </fieldset> 
</div> 

mio pulsante:

<a href="##" 
    id="dialog_link#getALLFacilityEquipOrders.order_id#" 
    class="ui-state-default ui-corner-all" 
><span class="ui-icon ui-icon-newwin"></span>Notes</a> 
+0

nota che sto facendo segni di doppia sterlina dove è necessario per fuggire. Per chi non ha familiarità, CF utilizza segni di sterlina attorno a variabili per l'output. – Steve

+2

AGGIORNAMENTO: l'ho ottenuto dopo aver spostato appendTo() sulla funzione clic del pulsante: // Pulsante di dialogo $ ("## opener # getALLFacilityEquipOrders.order_id #") .click (function() { $ ("## dialog # getALLFacilityEquipOrders.order_id #"). dialog ("open"); $ ("## dialog # getALLFacilityEquipOrders.order_id #"). parent(). appendTo ($ ("form ## allequipedit") return false; }); – Steve

10

essere consapevoli del fatto che v'è un'impostazione aggiuntiva in jQuery UI v1.10. È stata aggiunta un'impostazione appendTo per risolvere la soluzione alternativa ASP.NET che si sta utilizzando per aggiungere nuovamente l'elemento al modulo.

Prova:

$("#dialog").dialog({ autoOpen: false, height: 280, width: 440, modal: true, appendTo:"form" }); 
0

funziona come previsto quando ho usato

$("#divDlg").dialog("destroy"); 

invece di

$("#divDlg").dialog("close").appendTo($("#Form1")).hide(); 

Quando ci aggiungiamo alla forma e riaprire la finestra, ho avuto problemi con layout e z-index.

Problemi correlati