私はASP.Net MVC
サイトを開発しており、その上に特定のActionLink
を持つ特定の行の予約をキャンセルするために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 Dialog
を使用して、ユーザーが予約をキャンセルしてもよいかどうかを確認するメッセージをポップアップ表示できると便利です。私はこれを機能させようとしましたが、パラメータを受け入れるjQuery関数を作成して、
<a href="/Booking.aspx/Cancel/10">cancel</a>
と
<a href="#" onclick="ShowDialog(10)">cancel</a>
。
ShowDialog
関数はダイアログを開き、パラメーター10をダイアログに渡します。ユーザーが[はい]をクリックすると、href:/Booking.aspx/Change/10
が投稿されます。
次のようなスクリプトでjQueryダイアログを作成しました。
$(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"
}
});
});
そしてダイアログ自体:
<div id="dialog" title="Cancel booking">Are you sure you want to cancel your booking?</div>
最後に私の質問に:これをどのように達成できますか?それとももっと良い方法がありますか?
次のようにできます:
<a>
をクラスでマークし、「キャンセル」と言いますclass = "cancel"ですべての要素を操作してダイアログを設定します。
$('a.cancel').click(function() {
var a = this;
$('#myDialog').dialog({
buttons: {
"Yes": function() {
window.location = a.href;
}
}
});
return false;
});
(その他のオプション)
重要なポイントは次のとおりです。
ただし、キャンセルアクションには副作用があるため、これをGETではなくPOSTにすることをお勧めします。したがって、 GETセマンティクスに準拠しません ...
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);
}
}
});
あなたがjQueryで何をしているのかという点では、あなたが持っているように関数を連鎖させることができ、内側の関数は外側の関数から変数にアクセスできるということです。したがって、ShowDialog(x)関数にはこれらの他の関数が含まれています。これらの関数内でx変数を再利用でき、外部関数からパラメーターへの参照として使用されます。
私はmauschに同意します。これらのアクションにPOSTを使用することを実際に検討する必要があります。これにより、各要素の周囲に<form>
タグが追加されますはるかに少ない。変更アクションはそのままである可能性があります(おそらく編集フォームを開くだけです)。
数時間のtry/catchの後、私はついにこの作業例を使用しました。新しい行を含むAJAX POSTの作業はTABLEにオンザフライで追加されます(これが私の本当の問題でした)。
Tha magicには、次のリンクが付属しています。
<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>
私は今あなたの提案を試みましたが、それがちょっとうまくいくことがわかりました、
以下の私の「新しい」スクリプトをご覧ください。
$('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;
});
});
手がかりはありますか?
ああ、私のアクションリンクは次のようになります。
<%= Html.ActionLink("Cancel", "Cancel", new { id = v.BookingId }, new { @class = "cancel" })%>
コードを見て、必要なことは、ウィンドウを閉じてページを更新する機能を追加することです。 「はい」関数に次のように記述します。
buttons: {
"Ja": function() {
$.post(a.href);
$(a). // code to remove the table row
$("#dialog").dialog("close");
},
"Nej": function() { $(this).dialog("close"); }
},
テーブルの行を削除するコードは書くのが面白くないので、細かい点については説明しますが、基本的には、投稿後にダイアログに何をするかを伝える必要があります。スマートなダイアログかもしれませんが、何らかの方向性が必要です。
私のためのこの仕事:
<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」をクリックすると
私が採用した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){
}
})
}
}
});
Divタグの最初の問題は簡単でした。style="display:none;"
を追加し、ダイアログを表示する前にダイアログスクリプトにこれを追加しました。
$("#dialog").css("display", "inherit");
しかし、投稿版については、私はまだ運が悪いです。
ダイアログを完全に制御したい場合は、いくつかのアイデアが役立つかもしれませんが、デフォルトのボタンオプションの使用を避け、#dialog divに自分でボタンを追加することができます。クリックなどのリンクのダミー属性にデータを入れることもできます。必要なときにattr( "data")を呼び出します。
これが役立つことを願っています
$("#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>