2010-11-09 16 views
2

Je voudrais utiliser la boîte de dialogue de jQuery UI pour implémenter une boîte de dialogue de confirmation qui s'affiche lorsque l'utilisateur clique sur un lien de suppression (implémenté en utilisant un asp:LinkButton).
J'utilise le code comme indiqué ci-dessous (copié à partir de la documentation ui jquery):Utilisation du dialogue jquery-ui comme dialogue de confirmation avec un ASP: LinkButton (comment appeler le postbck)

<!-- the delete link --> 
<asp:LinkButton ID="btnDelete" runat="server" Text="Delete" 
    OnClick="btnDelete_Click" CssClass="btnDelete"></asp:LinkButton> 

<!-- the confirm-dialog --> 
<div id="dialog-confirm-delete" title="Delete?" style="display:none;"> 
    <p>Are you sure you want to permanently deleted the selected items?</p> 
</div> 

<script> 
$(document).ready(function() { 
    // setup the dialog 
    $('#dialog-confirm-delete').dialog({ 
     autoOpen: false, 
     modal: true, 
     buttons: { 
      "Delete all items": function() { 
       $(this).dialog("close"); 
       // ===>>> how to invoke the default action here 
       }, 
      Cancel: function() { $(this).dialog("close"); } 
     } 
    }); 

    // display the dialog 
    $('.btnDelete').click(function() { 
     $('#dialog-confirm-cancel').dialog('open'); 
     // return false to prevent the default action (postback) 
     return false; 
    }); 

}); 
</script> 

Ainsi, dans le gestionnaire d'événements click, je dois prévenir l'action par défaut du LinkButton (le postback) et affiche à la place le dialogue

Ma question est: comment puis-je invoquer l'action par défaut (la publication) du lien de suppression pour effectuer la publication au cas où l'utilisateur cliquait sur le bouton "Supprimer tous les éléments" de la boîte de dialogue?

Répondre

6

OK, voici mon approche (cela fonctionne, mais il pourrait ne pas être la meilleure solution):

$(document).ready(function() { 
    $('#dialog-confirm-cancel').dialog({ 
    autoOpen: false, 
    modal: true, 
    buttons: { 
     "Delete all items": function() { 
     // invoke the href (postback) of the linkbutton, 
     // that triggered the confirm-dialog 
     eval($(this).dialog('option', 'onOk')); 
     $(this).dialog("close"); 
     }, 
     Cancel: function() { $(this).dialog("close"); } 
    } 
    }); 

    $('.btnDelete').click(function() { 
    $('#dialog-confirm-delete') 
     // pass the value of the LinkButton's href to the dialog 
     .dialog('option', 'onOk', $(this).attr('href')) 
     .dialog('open'); 
    // prevent the default action, e.g., following a link 
    return false; 
    }); 
}); 
+0

Que fait 'eval()' href? Le href n'est-il pas une URL? De plus, ma réponse éditée ne fonctionne-t-elle pas? –

+0

@Drackir: Ce n'est pas un chemin vers un fichier. Je veux invoquer le PostBack du LinkButton, qui est un appel de fonction javascript, par exemple. __doPostback (...) – M4N

+0

Donc le href contient ce code JavaScript? –

0

Si vous regardez le Project Awesome on Codeplex il a une implémentation générique d'une boîte de dialogue de confirmation que vous pouvez inspecter pour votre portée.

0

Essayez d'ajouter $("#yourformid").submit(); à cet endroit // ===>>> how to invoke the default action here. Selon le : "... l'action de soumission par défaut sur le formulaire sera déclenchée, de sorte que le formulaire sera soumis."

Modifier
Vous pouvez essayer de faire quelque chose comme ceci:

$('.btnDelete').click(function (event, confirmed) { 
    if (confirmed) { 
     return true; 
    } else { 
     $('#dialog-confirm-cancel').dialog('open'); 
     // prevent the default action, e.g., following a link 
     return false; 
    } 
});

Et puis dans votre supprimer toutes les fonctions des éléments:

"Delete all items": function() { 
    $(this).dialog("close"); 
    $('.btnDelete').trigger("click", [true]); 
},
+0

Je ne pense pas que cela fonctionnera. Je dois invoquer le PostBack de LinkButton. – M4N

+0

@ M4N - Avez-vous essayé d'appeler la fonction '.click()' sur l'ID du bouton? Ex: '$ (" # buttonid "). Click();' Vous aurez peut-être besoin du ClientID du bouton lors de l'exécution pour être sûr que Asp.Net ne bousillera pas le nom. Je n'ai pas Asp.Net ici, mais il devrait être quelque chose comme ceci: '$ (" # <% = btnDelete.ClientID%> "). Click();' –

+0

Cela ne déclencherait pas le gestionnaire d'événements click une fois de plus ? – M4N

0

donc vous a empêché l'action par défaut du lien (en suivant le lien), non? Donc, l'ajout de location.replace('path/to/file'); après $(this).dialog('close'); résoudrait votre problème.

Je ne suis pas sûr d'avoir bien compris votre question.

+0

Je n'ai pas de chemin vers un fichier. Je veux invoquer le PostBack du LinkButton (qui est un appel de fonction javascript: __doPostback (...)) – M4N

1

Si vous ne faites rien de plus que ce que vous pouvez confirmer ajouter un attribut au bouton.

<asp:LinkButton ID="btnDelete" runat="server" Text="Delete" 
    OnClientClick="if(!confirm('Are you sure?'))return false;" CssClass="btnDelete"></asp:LinkButton> 
+3

Ou mieux encore 'return confirm (" Etes-vous sûr? ");'. Cependant, M4N a dit qu'ils utilisent les Dialogues jQuery pour cela et qu'ils veulent probablement garder une impression cohérente pour toutes les boîtes de message/pop-ups. –

+0

lol je ne pouvais pas me souvenir de ce que c'était, je n'ai pas utilisé webforms dans quelques années. Je suppose que vous pouvez faire cela sur les liens d'action, mais oui, c'est compréhensible si vous gardez un look unifié. Cela semble juste beaucoup de travail pour un dailog de confirmation. –

+0

Merci, mais ce n'est pas une simple boîte de dialogue de confirmation. La boîte de dialogue contient également d'autres éléments (zones de texte, etc.). – M4N

0
$('#dialog-confirm-delete').dialog({ 
    autoOpen: false, 
    modal: true, 
    buttons: { 
     Cancel: function() { 
      $(this).dialog("close"); 
     }, 
     "Delete all items": function() { 
      $(this).dialog("close"); 
      // ===>>> how to invoke the default action here 
     } 
    } 
}); 
0

Si vous utilisez un LinkButton vous pouvez le faire:

__doPostBack ("<% = lnkMyButton.UniqueID%>", "");