我正在开发一个ASP.Net MVC
网站,并在其上列出了一个带有ActionLink
的表格中的数据库查询的预订,以取消具有特定{{1}的特定行的预订像这样:
我的预订
BookingId
如果我可以使用<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>
弹出一条消息,询问用户是否确定要取消预订,那会更好。我一直在努力让这个工作,但我一直在坚持如何创建一个接受参数的jQuery函数,以便我可以替换
jQuery Dialog
带
<a href="/Booking.aspx/Cancel/10">cancel</a>
。
然后<a href="#" onclick="ShowDialog(10)">cancel</a>
函数将打开对话框并将参数10传递给对话框,这样如果用户单击是,那么它将发布href:ShowDialog
我在这样的脚本中创建了jQuery Dialog:
/Booking.aspx/Change/10
和对话框本身:
$(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"
}
});
});
最后我的问题是:我怎样才能做到这一点?或者有更好的方法吗?
答案 0 :(得分:270)
jQuery提供了一种为您存储数据的方法,无需使用虚拟属性或查找问题的解决方法。
绑定点击事件:
$('a[href*=/Booking.aspx/Change]').bind('click', function(e) {
e.preventDefault();
$("#dialog-confirm")
.data('link', this) // The important part .data() method
.dialog('open');
});
你的对话:
$("#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);
}
}
});
答案 1 :(得分:45)
你可以这样做:
<a>
,说“取消”通过使用class =“cancel”:
对所有元素进行操作来设置对话框$('a.cancel').click(function() {
var a = this;
$('#myDialog').dialog({
buttons: {
"Yes": function() {
window.location = a.href;
}
}
});
return false;
});
(加上你的其他选择)
这里的关键点是:
但是,我建议您将其设为POST而不是GET,因为取消操作有副作用,因此doesn't comply with GET semantics ...
答案 2 :(得分:2)
就你在使用jQuery做的事情而言,我的理解是你可以像你一样链接函数,而内部函数可以访问外部函数。那么你的ShowDialog(x)函数包含这些其他函数,你可以在它们中重复使用x变量,它将被作为外部函数参数的引用。
我同意mausch,您应该真正考虑使用POST来执行这些操作,这会在每个元素周围添加<form>
标记,但是使自动脚本或工具触发Cancel事件的可能性大大降低。 “更改”操作可以保持原样,因为它(可能只是打开一个编辑表单)。
答案 3 :(得分:1)
我现在已经尝试了你的建议,发现它有点有效,
请点击下面的“新”脚本:
$('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;
});
});
任何线索?
哦,我的Action链接现在看起来像这样:
<%= Html.ActionLink("Cancel", "Cancel", new { id = v.BookingId }, new { @class = "cancel" })%>
答案 4 :(得分:1)
查看代码您需要做的是添加关闭窗口和更新页面的功能。在“是”功能中,您应该写:
buttons: {
"Ja": function() {
$.post(a.href);
$(a). // code to remove the table row
$("#dialog").dialog("close");
},
"Nej": function() { $(this).dialog("close"); }
},
删除表行的代码编写起来并不好玩,所以我会让你处理细节,但基本上,你需要在发布后告诉对话框该做什么。它可能是一个聪明的对话,但它需要某种方向。
答案 5 :(得分:1)
经过几个小时的try / catch后,我终于来到了这个工作示例,它使用新行的AJAX POST工作会动态附加到TABLE(这是我真正的问题):
Tha魔法附带了这个链接:
<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>
这是使用AJAX POST和Jquery Dialog的最终版本:
<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>
答案 6 :(得分:1)
这项工作对我来说:
<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')); } }
});
}
单击对话框警报显示100中的“Sposta”
答案 7 :(得分:0)
好吧,div标签的第一个问题很简单:
我刚刚添加了style="display:none;"
,然后在显示对话框之前,我在对话框脚本中添加了这个:
$("#dialog").css("display", "inherit");
但对于后期版本,我仍然不幸。
答案 8 :(得分:0)
只是给你一些想法可能对你有帮助,如果你想要完全控制对话,你可以尝试避免使用默认按钮选项,并在#dialog div中自己添加按钮。您还可以将数据放入链接的某个虚拟属性,例如Click。在需要时调用attr(“data”)。
答案 9 :(得分:0)
我雇用的Boris Guery启发的解决方案看起来像这样: 链接:
<a href="#" class = "remove {id:15} " id = "mylink1" >This is my clickable link</a>
将动作绑定到它:
$('.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;
}
});
然后访问id字段(在这种情况下,值为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){
}
})
}
}
});
答案 10 :(得分:0)
我希望这有帮助
$("#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>