2009-02-20 8 views
27

Ich habe ein jQuery UI Modal Formular erstellt, und ich möchte, dass dieses Formular ein Postback auslösen, aber ich habe Schwierigkeiten, es zur Arbeit zu bekommen.jQuery modal form dialog postback probleme

Ich weiß, dass es ziemlich viele Artikel gibt, die auf der Verwendung des SimpleModal-Plugins basieren, und ich habe versucht, diese anzupassen und die _doPostback-Funktion außer Kraft zu setzen, aber ohne Freude.

Ich denke, das Problem liegt im Aufruf meiner __doPostBack-Funktion und was die Parameter sein sollten. Ist das der Fall?

Hier ist meine Form

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

Hier ist der JavaScript-Code:

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

Antwort

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

Die __doPostBack Funktion übernimmt die Steuerung, die die Postbacks ist verursacht und ein Argument, wenn erforderlich. Ihre JavaScript-Beispiele und Ihr Markup scheinen nicht übereinzustimmen. Zum Beispiel, wo ich oben zitiert habe, verweisen Sie AspnetForm, ändern Sie dies zur ID des Formulars und versuchen Sie es erneut.

Stellen Sie sicher, dass die ID, die Sie für das Clientskript verwenden, mit der Client-ID des Steuerelements ASP.NET zur Laufzeit identisch ist. Wenn sich ein Steuerelement in einem INamingContainer befindet, wird es basierend auf seinem übergeordneten Container eine eindeutige ID haben, sodass YourControlID YourINaminContainerID_YourControlID wird.

Lassen Sie uns das Ergebnis wissen.

+0

der Grund, warum ich die ID aspnetForm gesetzt war, weil ich die reale Form Name versucht, mit - summaryForm und meine Firebug JavaScript-Debugger, sagte __EVENTTARGET null war. Ich untersuchte die Quelle und bemerkte, dass asp.net die clientside ID zu aspnetForm ändert - immer noch __EVENTTARGET ist null ... – mancmanomyst

+0

ist das Steuerelement, das Postback das Formular selbst oder die Schaltfläche verursacht? In diesem Fall ist es ein modales Dialogfeld, so dass es keine Schaltfläche zum Senden gibt.Ich habe versucht, meine eigene Übermittlungsschaltfläche zu addieren, anstatt eine der jquery erzeugten Tasten auch zu überschreiben, aber das hat auch nicht funktioniert. – mancmanomyst

0

Ich habe es geschafft, das Problem zu lösen - wahrscheinlich nicht der beste Weg, aber hier ist, was ich getan habe.

Der Dialog würde kein Postback geben, da jQuery UI den Submit-Button aus dem Formular entfernt und an den unteren Rand des Body-Tags anhängt. Wenn Sie also versuchen, den Button zu posten, weiß er nicht, was er schreibt.

ich um diesen bekam den jQuery UI-Code durch Modifizieren von diesem Wechsel:

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

Um dies:

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

Es ist nicht ideal, um die Source-Bibliothek zu ändern, aber es ist besser als nichts .

1

Eine freche Hack, den ich verwendet habe, ist eine normale .NET Taste zusammen mit Textfeldern zu erstellen, usw. innerhalb eines div auf der Seite, mit jQuery die HTML für das div erhalten, fügen Sie den Dialog, und entfernen Sie dann die HTML innerhalb des ursprünglichen div, um eine ID-Duplizierung zu vermeiden.

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

Und das Skript:

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

nach dem Dialog einfach bewegen, um den Dialog wieder in Ihre Form zu schaffen. Beispiel:

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

Das funktionierte für mich. Postback funktioniert finden.

+1

Nachdem ich den ganzen Morgen mit diesem Problem gerungen habe, bin ich auf dieses Problem gestoßen und es funktioniert super. Ich liebe 1 Line Fixes. – hacker

+0

Das funktionierte auch für mich. Vielen Dank! –

+0

Danke dafür. Ersparte mir eine Menge Schmerzen – AJM

1

Vielen Dank für die Post von csharpdev! Der folgende Code hat es für meine Seite:

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

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

ich diese Arbeit bekommen kann, wenn ich einen von jedem haben. Ein div, ein Skript und ein Link. In meinem Fall erlaubt der Dialog dem Benutzer, eine "Notiz" pro Datenbankeintrag zu hinterlassen. Ich habe keine Schaltflächen in meinem Dialog, nur die Standard oben rechts "x", um den Dialog zu schließen.

Aber ich versuche, dies innerhalb einer ColdFusion Abfrage-Schleife zu arbeiten. Mehrere Datensätze, mit jeweils eigenen eigenen Dialog-Taste, Skript zugeordnet, und div. Ich ändere die IDs dynamisch, so dass sie alle eindeutig sind (das heißt, ein _XX anfügen, wobei XX der Primärschlüssel des Datensatzes für alle IDs ist).

Wenn ich zu diesem Modell erweitern, mehrere Dialoge, Skripte, divs .. Wenn ich jeden Dialog öffnen, um die entsprechende "Notiz" für diesen Datensatz zu bearbeiten, speichert es nur die letzte. Soll ich die .parent(). AppendTo auf einen Button klicken vs. automatisch? Irgendwo wird es verwirrt.

Wenn ich keinen Dialog öffne (keine Änderungen über Dialog vornehmen) und einen Dump auf den Formularergebnissen ausführen, werden alle Dialogfelder wie erwartet auf dem Post angezeigt.

Wenn ich mir den erzeugten HTML-Code ansehe ... Alle IDs sind eindeutig und werden entsprechend aufgerufen. Ich dachte, ich würde irgendwo einen Konflikt mit einem Namen/einer ID kriegen, aber es sieht auf der Vorderseite gut aus.

Mein Skript:

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

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

Meine Taste:

<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

richtig zu z-indexieren Hinweis: Ich mache Doppel-Pfund-Zeichen, wo nötig, um es zu entkommen. Für diejenigen, die nicht vertraut sind, verwendet CF Pfundzeichen um Variablen für die Ausgabe. – Steve

+2

UPDATE: Ich habe das funktioniert, sobald ich die appendTo() auf die Klick-Funktion der Schaltfläche verschoben: // Dialog button $ ("## opener # getALLFacilityEquipOrders.order_id #") .click (function() { $ ("## dialog # getALLFacilityEquipOrders.order_id #"). dialog ("open"); $ ("## dialog # getALLFacilityEquipOrders.order_id #"). übergeordnete(). appendTo ($ ("form ## allequipedit")); return false; }); – Steve

10

bewusst sein, dass es eine zusätzliche Einstellung ist v1.10 in jQuery UI. Es gibt eine AppendTo-Einstellung, die hinzugefügt wurde, um die ASP.NET Problemumgehung zu beheben, die Sie verwenden, um das Element erneut dem Formular hinzuzufügen.

Versuchen:

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

Es funktioniert wie erwartet, wenn ich

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

statt

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

Wenn wir an das Formular anhängen und den Dialog wieder zu öffnen, ich hatte Probleme mit Layouts und Z-Index.