Я разрабатываю сайт 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>
Итак, наконец, мой вопрос: как я могу этого добиться? или есть лучший способ сделать это?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сделать это можно так:
<a> классом, скажите "отменить"настройте диалог, воздействуя на все элементы с помощью class = "cancel":
$('a.cancel').click(function() {
var a = this;
$('#myDialog').dialog({
buttons: {
"Yes": function() {
window.location = a.href;
}
}
});
return false;
});
(плюс другие варианты)
Ключевые моменты здесь:
Однако я рекомендую вам сделать это POST вместо GET, поскольку действие отмены имеет побочные эффекты и, следовательно, не соответствует семантике GET ...
Чтобы сделать это постом, вместо изменения window.location вы можете использовать функцию jQuery $ .post () ajax. См. docs.jquery.com/Ajax/jQuery.post#examples
Я бы не стал использовать $ .post (), этот подход плохо ухудшается. Просто напишите стандартный <form> без какого-либо ajax, заставьте его работать без подтверждения, а тогда добавьте подтверждение «поверх» вашего <form>
Это также известно как подход hijax (domscripting.com/blog/display/41).
Вы не используете имеют для использования post, но если вы используете get для операции изменения базы данных, вы открываете себя для атаки «подделки межсайтового запроса» ... см .: en.wikipedia.org/wiki/Cross-site_request_forgery
Что касается того, что вы делаете с jQuery, я понимаю, что вы можете связывать функции, как у вас, и внутренние имеют доступ к переменным из внешних. Итак, если ваша функция ShowDialog (x) содержит эти другие функции, вы можете повторно использовать в них переменную x, и она будет принята как ссылка на параметр из внешней функции.
Я согласен с mausch, вам действительно стоит подумать об использовании POST для этих действий, который добавит тег <form> вокруг каждого элемента, но значительно снизит вероятность того, что автоматический скрипт или инструмент запустит событие Cancel. Действие «Изменить» можно оставить как есть, потому что оно (предположительно, просто открывает форму редактирования).
Я попробовал ваши предложения и обнаружил, что это вроде работает,
Смотрите мой «новый» сценарий ниже:
$('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" })%>
См. Мои комментарии к моему ответу об использовании $ .post () и подхода hijax.
Хорошо, первая проблема с тегом div была достаточно простой:
Я просто добавил к нему style = "display:none;", а затем, прежде чем показывать диалог, я добавил это в свой скрипт диалога:
$("#dialog").css("display", "inherit");
Но с пост-версией мне все равно не повезло.
См. Мои комментарии к моему ответу об использовании $ .post () и подхода hijax.
Глядя на свой код, вам нужно добавить функцию закрытия окна и обновления страницы. В вашей функции «Да» вы должны написать:
buttons: {
"Ja": function() {
$.post(a.href);
$(a). // code to remove the table row
$("#dialog").dialog("close");
},
"Nej": function() { $(this).dialog("close"); }
},
Код для удаления строки таблицы писать неинтересно, поэтому я позволю вам разобраться с мельчайшими подробностями, но в основном вам нужно указать диалоговому окну, что делать после его публикации. Это может быть умный диалог, но он требует определенного направления.
Спасибо за Ваш ответ. Я попробую и найду способ убрать строку ...
Я думал об этом, если вы добавите идентификатор к тегу '<TR>', тогда вы сможете заставить jQuery достаточно легко удалить эту строку.
Просто дайте вам некоторую идею, это может помочь вам, если вы хотите полностью контролировать диалог, вы можете попытаться избежать использования параметров кнопок по умолчанию и добавить кнопки самостоятельно в свой #dialog div. Вы также можете поместить данные в какой-нибудь фиктивный атрибут ссылки, например Click. вызовите attr ("данные"), когда вам это нужно.
После НЕСКОЛЬКИХ ЧАСОВ try / catch я наконец пришел с этим рабочим примером, его работа с AJAX POST с новыми строками добавляется в ТАБЛИЦУ на лету (это была моя настоящая проблема):
Магия пришла со ссылкой на это:
<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>
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);
}
}
});
Это прекрасное решение. Я не знал, что вы можете установить данные в диалоговом окне, используя .data. Я давно устанавливал глобальные переменные, получая к ним доступ из своих диалогов, а затем уничтожая их!
Большое спасибо за эту магию .data (). Обратите внимание на следующее обновление: «Начиная с jQuery 1.7, метод .on () является предпочтительным методом для присоединения обработчиков событий к документу» api.jquery.com/bind
Параметр .data определенно подходит. Спасибо!
+1 Я искал документацию по jquery ui и не мог найти ее, пока не понял, что это метод из самого ядра jQuery. Очень хороший улов
@ boris-guery Привет, попробовал, но не получилось. Это просто не предотвращает действие по умолчанию, поэтому вместо открытия диалогового окна выполняется переход по ссылке. Любая помощь приветствуется: я делаю jsfiddle: jsfiddle.net/sebababi/9zKcZ
@Sebastian, похоже, вы обернули значение атрибута цитатой: jsfiddle.net/96TK7/2 Кстати, вы не должны больше использовать .bind, который устарел, а вместо этого .on, проверьте документацию jQuery.
@ boris-guery, спасибо, Борис, я видел твою скрипку, но у меня она, похоже, не работает. Я даже не получаю всплывающее предупреждение «здесь». Я изменил привязку на включенную. jsfiddle.net/96TK7/3 Я даже пробовал с jQuery 2.0.2. Открывает ли он диалоговое окно и предупреждение на вашем конце? Благодарю.
@ Себастьян, ну это странно, я правильно получаю предупреждение, и мне это кажется правильным. Однако я советую вам задать новый вопрос по этой теме, если у вас возникнут трудности с его настройкой.
@Frodo Метод .data() является частью самого jQuery, а не пользовательского интерфейса jQuery: api.jquery.com/data
Решение, вдохновленное Борисом Гери, которое я использовал, выглядит так: Связь:
<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){
}
})
}
}
});
Эта работа для меня:
<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
надеюсь, это поможет
$("#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>
Привет, @ffernandez, вероятно, лучше попытаться включить некоторое описание того, что вы делаете, а не просто бросать код в OP.
Спасибо за хороший ответ. Я попробую, но один вопрос. вы упомянули, что лучше сделать это POST вместо GET, что подразумевает, что обычный href, такой как href = "/ Booking.aspx / Cancel / 10", будет GET, верно? и если да, то что бы он хотел сделать постом?