2010-05-08 5 views
4

Cela me rend fou! J'ai lu au moins 5 questions sur ici étroitement liées à mon problème, et probablement 5 ou plus de pages seulement de googling. Je ne comprends pas. J'essaye d'avoir une boîte de dialogue de jqueryui quand un utilisateur remplit un formulaire disant "inscription soumise" et puis redirigeant vers une autre page, mais je ne peux pas pour la vie de moi obtenir n'importe quel javascript pour fonctionner, pas même un alerte unique.Exécuter javascript après la soumission du formulaire dans le panneau de mise à jour?

Voici mon panneau de mise à jour:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<asp:UpdatePanel ID="upForm" runat="server" 
    UpdateMode="Conditional" ChildrenAsTriggers="False"> 
    <ContentTemplate> 
       'Rest of form' 
     <asp:Button ID="btnSubmit" runat="server" Text="Submit" /> 
       <p>Did register Pass? <%= registrationComplete %></p> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Le Jquery Je veux exécuter: (En ce moment cela est assis dans la tête du balisage, avec Autoopen à false)

<script type="text/javascript"> 
function pageLoad() { 

    $('#registerComplete').dialog({ 
     autoOpen: true, 
     width: 270, 
     resizable: false, 
     modal: true, 
     draggable: false, 
     buttons: { 
      "Ok": function() { 
      window.location.href = "someUrl"; 
     } 
     } 
    }); 

} 
    </script> 

Enfin mon code derrière: (en commentaire toutes les choses que j'ai essayé)

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSubmit.Click  
     'Dim sbScript As New StringBuilder()' 
      registrationComplete = True 
      registrationUpdatePanel.Update() 

      'sbScript.Append("<script language='JavaScript' type='text/javascript'>" + ControlChars.Lf)' 
      'sbScript.Append("<!--" + ControlChars.Lf)' 
      'sbScript.Append("window.location.reload()" + ControlChars.Lf)' 
      'sbScript.Append("// -->" + ControlChars.Lf)' 
      'sbScript.Append("</")' 
      'sbScript.Append("script>" + ControlChars.Lf)' 

      'ScriptManager.RegisterClientScriptBlock(Me.Page, Me.GetType(), "AutoPostBack", sbScript.ToString(), False)' 
      'ClientScript.RegisterStartupScript("AutoPostBackScript", sbScript.ToString())' 
          'Response.Write("<script type='text/javascript'>alert('Test')</script>")' 
      'Response.Write("<script>windows.location.reload()</script>")' 
End Sub 

J'ai essayé:

  • Passer des variables du serveur vers le client via ligne <% =%> dans le javascript bloc de l'étiquette de tête.

  • Mettre le même code dans un script
    dans le panneau de mise à jour.

  • a essayé d'utiliser
    RegisterClientScriptBlock et
    RegisterStartupScript

  • Juste faire un Response.Write avec la balise de script écrit en elle.

  • Essayé diverses combinaisons de mettre l'intégralité du code de jquery.dialog dans le script de registerstartup, ou tout simplement
    essayer de changer la Autoopen
    propriété, ou tout simplement appeler « ouvrir » sur
    il.

Je ne peux même pas obtenir une simple alerte pour travailler avec l'un de ceux-ci, donc je fais quelque chose de mal, mais je ne sais pas ce que c'est.

Voici ce que je sais:

  • Le Jquery lie correctement même sur postbacks async, car le div conteneur qui est la boîte de dialogue est toujours invisible, j'ai vu un après le similaire ici indiquant que causait un problème, ce n'est pas le cas ici.

  • En utilisant page_load au lieu de
    document.ready depuis est censé pour fonctionner sur les deux normales et async
    postbacks, de sorte que ce n'est pas la question.

  • Le panneau de mise à jour est mise à jour correctement car <p>Did register Pass? <%= registrationComplete %></p> mises à jour de vrai après que je soumettre le formulaire.

Alors, comment puis-je faire ce travail? Tout ce que je veux c'est -> cliquer sur le bouton soumettre dans un panneau de mise à jour -> exécuter le code côté serveur pour valider le formulaire et l'insérer dans db -> si tout a réussi, faire apparaître cette boîte de dialogue jquery (modal).

Répondre

2

Pour vous inscrire à partir du Codebehind, here's the format:

ClientScript.RegisterStartupScript(GetType(), "AutoPostBackScript", 
            "alert('hi');", True); 

Le true à la fin indique pour envelopper votre code dans <script> balises, laissez-le si vous voulez faire les tags vous-même.

+0

@Nick: Je ne sais pas pourquoi mais l'enregistrement de javascript sur les publications asynchrones ne fonctionne jamais à moins que j'utilise comme paramètre le type du panneau de mise à jour (UpdatePanel1.GetType()) –

+0

@Claudio - Dépend de l'endroit d'où il est appelé, doit être appelé un contrôle qui participe à la mise à jour, le panneau de mise à jour lui-même n'est pas un mauvais type pour le coller, donc oui cela fonctionne :) –

+1

vous devriez utiliser 'ScriptManager' au lieu de' ClientScript' pour les pages avec 'UpdatePanels'. – lincolnk

3

Vous pouvez extraira le endRequest event:

function pageLoad() { 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, e) { 
     // this function will be executed after the update panel finished 
     // the AJAX request, so here you may open your jQuery dialog 

     if (e.get_error()) { 

     } else { 

     } 
    }); 
} 
+0

Alors, comment pourrais-je passer une variable comme je l'ai fait ci-dessus? Le problème que j'ai rencontré est que la variable que je passe dans <%= %> s'exécute seulement une fois quand la page est chargée. Toute publication ultérieure asynchrone peut exécuter ce code, mais elle ne serait pas mise à jour avec la valeur la plus récente de registrationComplete. Qu'est-ce que E dans votre exemple? La page? Donc, dans votre exemple, j'aurais une fonction get_error() dans le code derrière et cela fonctionnerait? Ou serait-ce dans le Javascript? Si dans le Javascript, je rencontre toujours la question de lui donner la valeur mise à jour. – AverageJoe719

Questions connexes