Je développe un site ASP.Net MVC
et j'y répertorie certaines réservations d'une requête de base de données dans une table avec un ActionLink
pour annuler la réservation sur une ligne spécifique contenant un certain BookingId
comme ça:
Mes réservations
<table cellspacing="3">
<thead>
<tr style="font-weight: bold;">
<td>Date</td>
<td>Time</td>
<td>Seats</td>
<td></td>
<td></td>
</tr>
</thead>
<tr>
<td style="width: 120px;">2008-12-27</td>
<td style="width: 120px;">13:00 - 14:00</td>
<td style="width: 100px;">2</td>
<td style="width: 60px;"><a href="/Booking.aspx/Cancel/15">cancel</a></td>
<td style="width: 80px;"><a href="/Booking.aspx/Change/15">change</a></td>
</tr>
<tr>
<td style="width: 120px;">2008-12-27</td>
<td style="width: 120px;">15:00 - 16:00</td>
<td style="width: 100px;">3</td>
<td style="width: 60px;"><a href="/Booking.aspx/Cancel/10">cancel</a></td>
<td style="width: 80px;"><a href="/Booking.aspx/Change/10">change</a></td>
</tr>
</table>
Ce qui serait bien si je pouvais utiliser le jQuery Dialog
pour faire apparaître un message demandant à l'utilisateur s'il est sûr de vouloir annuler la réservation. J'ai essayé de faire en sorte que cela fonctionne, mais je reste bloqué sur la façon de créer une fonction jQuery qui accepte les paramètres afin de pouvoir remplacer le
<a href="/Booking.aspx/Cancel/10">cancel</a>
avec
<a href="#" onclick="ShowDialog(10)">cancel</a>
.
La fonction ShowDialog
ouvrirait alors la boîte de dialogue et transmettrait également le paramètre 10 à la boîte de dialogue. Ainsi, si l'utilisateur clique sur Oui, il publiera le href: /Booking.aspx/Change/10
J'ai créé le dialogue jQuery dans un script comme celui-ci:
$(function() {
$("#dialog").dialog({
autoOpen: false,
buttons: {
"Yes": function() {
alert("a Post to :/Booking.aspx/Cancel/10 would be so Nice here instead of the alert");},
"No": function() {$(this).dialog("close");}
},
modal: true,
overlay: {
opacity: 0.5,
background: "black"
}
});
});
et le dialogue lui-même:
<div id="dialog" title="Cancel booking">Are you sure you want to cancel your booking?</div>
Alors finalement, à ma question: comment puis-je accomplir cela? ou y a-t-il une meilleure façon de le faire?
Vous pouvez le faire comme ceci:
<a>
avec une classe, dites "annuler"configurer le dialogue en agissant sur tous les éléments avec class = "cancel":
$('a.cancel').click(function() {
var a = this;
$('#myDialog').dialog({
buttons: {
"Yes": function() {
window.location = a.href;
}
}
});
return false;
});
(plus vos autres options)
Les points clés ici sont:
Cependant, je vous recommande d’en faire un POST au lieu d’un GET, puisqu’une action annulation a des effets secondaires et donc ne respecte pas la sémantique de GET ...
jQuery fournit une méthode qui stocke des données pour vous, pas besoin d'utiliser un attribut factice ni de trouver une solution de contournement à votre problème.
Lier l'événement click:
$('a[href*=/Booking.aspx/Change]').bind('click', function(e) {
e.preventDefault();
$("#dialog-confirm")
.data('link', this) // The important part .data() method
.dialog('open');
});
Et votre dialogue:
$("#dialog-confirm").dialog({
autoOpen: false,
resizable: false,
height:200,
modal: true,
buttons: {
Cancel: function() {
$(this).dialog('close');
},
'Delete': function() {
$(this).dialog('close');
var path = $(this).data('link').href; // Get the stored result
$(location).attr('href', path);
}
}
});
En ce qui concerne ce que vous faites avec jQuery, ma compréhension est que vous pouvez chaîner des fonctions comme vous avez et que les fonctions internes ont accès aux variables des fonctions externes. De même que votre fonction ShowDialog (x) contient ces autres fonctions, vous pouvez réutiliser la variable x en leur sein et cela sera pris comme référence au paramètre de la fonction externe.
Je suis d’accord avec mausch, vous devriez vraiment envisager d’utiliser POST pour ces actions, ce qui ajoutera un <form>
marque autour de chaque élément, mais rend beaucoup moins probable un script ou un outil automatisé déclenchant l’événement Cancel. L'action Modifier peut rester telle quelle car elle (ne fait probablement qu'ouvrir un formulaire d'édition).
Après PLUSIEURS HEURES d’essai/attrape, j’ai finalement trouvé cet exemple de travail, qui fonctionne AJAX POST avec de nouvelles lignes ajoutées à la TABLE à la volée (qui était mon vrai problème):
La magie est venue avec le lien suivant:
<a href="#" onclick="removecompany(this);return false;" id="remove_13">remove</a>
<a href="#" onclick="removecompany(this);return false;" id="remove_14">remove</a>
<a href="#" onclick="removecompany(this);return false;" id="remove_15">remove</a>
Ceci est le travail final avec AJAX POST et le dialogue Jquery:
<script type= "text/javascript">/*<![CDATA[*/
var $k = jQuery.noConflict(); //this is for NO-CONFLICT with scriptaculous
function removecompany(link){
companyid = link.id.replace('remove_', '');
$k("#removedialog").dialog({
bgiframe: true,
resizable: false,
height:140,
autoOpen:false,
modal: true,
overlay: {
backgroundColor: '#000',
opacity: 0.5
},
buttons: {
'Are you sure ?': function() {
$k(this).dialog('close');
alert(companyid);
$k.ajax({
type: "post",
url: "../ra/removecompany.php",
dataType: "json",
data: {
'companyid' : companyid
},
success: function(data) {
//alert(data);
if(data.success)
{
//alert('success');
$k('#companynew'+companyid).remove();
}
}
}); // End ajax method
},
Cancel: function() {
$k(this).dialog('close');
}
}
});
$k("#removedialog").dialog('open');
//return false;
}
/*]]>*/</script>
<div id="removedialog" title="Remove a Company?">
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>
This company will be permanently deleted and cannot be recovered. Are you sure?</p>
</div>
J'ai maintenant essayé vos suggestions et constaté que cela fonctionne un peu,
Voir mon "nouveau" script ci-dessous:
$('a.cancel').click(function() {
var a = this;
$("#dialog").dialog({
autoOpen: false,
buttons: {
"Ja": function() {
$.post(a.href);
},
"Nej": function() { $(this).dialog("close"); }
},
modal: true,
overlay: {
opacity: 0.5,
background: "black"
}
});
$("#dialog").dialog('open');
return false;
});
});
Des indices?
oh et mon lien d'action ressemble maintenant à ceci:
<%= Html.ActionLink("Cancel", "Cancel", new { id = v.BookingId }, new { @class = "cancel" })%>
En regardant votre code, vous devez ajouter la fonctionnalité pour fermer la fenêtre et mettre à jour la page. Dans votre fonction "Oui", vous devriez écrire:
buttons: {
"Ja": function() {
$.post(a.href);
$(a). // code to remove the table row
$("#dialog").dialog("close");
},
"Nej": function() { $(this).dialog("close"); }
},
Le code pour supprimer la ligne de la table n’est pas amusant à écrire, je vous laisse donc traiter des détails les plus importants, mais, en gros, vous devez indiquer à la boîte de dialogue ce qu’elle doit faire après sa publication. C'est peut-être un dialogue intelligent, mais il faut une sorte de direction.
Ce travail pour moi:
<a href="#" onclick="sposta(100)">SPOSTA</a>
function sposta(id) {
$("#sposta").data("id",id).dialog({
autoOpen: true,
modal: true,
buttons: { "Sposta": function () { alert($(this).data('id')); } }
});
}
Lorsque vous cliquez sur "Sposta" dans la boîte de dialogue, une alerte s’affiche 100
Une solution inspirée par Boris Guery et que j'ai employée ressemble à ceci: Le lien:
<a href="#" class = "remove {id:15} " id = "mylink1" >This is my clickable link</a>
y lier une action:
$('.remove').live({
click:function(){
var data = $('#'+this.id).metadata();
var id = data.id;
var name = data.name;
$('#dialog-delete')
.data('id', id)
.dialog('open');
return false;
}
});
Et ensuite pour accéder au champ id (dans ce cas avec la valeur 15:
$('#dialog-delete').dialog({
autoOpen: false,
position:'top',
width: 345,
resizable: false,
draggable: false,
modal: true,
buttons: {
Cancel: function() {
$(this).dialog('close');
},
'Confirm delete': function() {
var id = $(this).data('id');
$.ajax({
url:"http://example.com/system_admin/admin/delete/"+id,
type:'POST',
dataType: "json",
data:{is_ajax:1},
success:function(msg){
}
})
}
}
});
Ok, le premier problème avec la balise div était assez simple: je viens d’ajouter un style="display:none;"
et avant d’afficher la boîte de dialogue, j’ai ajouté ceci dans mon script de boîte de dialogue:
$("#dialog").css("display", "inherit");
Mais pour la version post, je n'ai toujours pas de chance.
Donnez-vous une idée. Peut-être vous aider si vous voulez contrôler pleinement la boîte de dialogue, essayez d'éviter d'utiliser les options de bouton par défaut et ajoutez des boutons vous-même dans votre #dialog div. Vous pouvez également mettre des données dans un attribut factice de lien, comme Click. appelez attr ("data") quand vous en avez besoin.
j'espère que ça aide
$("#dialog-yesno").dialog({
autoOpen: false,
resizable: false,
closeOnEscape: false,
height:180,
width:350,
modal: true,
show: "blind",
open: function() {
$(document).unbind('keydown.dialog-overlay');
},
buttons: {
"Delete": function() {
$(this).dialog("close");
var dir = $(this).data('link').href;
var arr=dir.split("-");
delete(arr[1]);
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
<a href="product-002371" onclick="$( '#dialog-yesno' ).data('link', this).dialog( 'open' ); return false;">Delete</a>