我有一些问题
@Ajax.ActionLink
我想显示确认对话框,是的,我知道我可以做到:
@Ajax.ActionLink("Do it!", "Delete", new AjaxOptions(){ Confirm = "Are you sure?" });
但我想拥有自己的MyConfirm对话框 我使用 alertify 。
所以我的代码是:
@Ajax.ActionLink("Do it!", "Delete", new AjaxOptions(){ OnBegin="return MyConfirm();"})
我的JavaScript函数:
function MyConfirm() {
alertify.confirm("Do you really want to do that??", function (e) {
if (e) return true;
else return false;
});
}
但如果我在 MyConfirm()函数中返回' false ',则Ajax请求停止并且我的“删除”操作不会开始(所以它的工作原理如何)。但在我的示例函数 MyConfirm()中显示我的MyConfirm对话框,但它也会立即重新生成,并且“删除”操作开始了!如何处理?
答案 0 :(得分:2)
根据:Javascript Alertify with return from confirm
Alertify是一种非阻塞代码,它会在用户做出响应之前返回。使用fiddler或firebug来查看用户选择和ajax请求的时间表。
function MyConfirm() {
alertify.confirm("Do you really want to do that??", function (e) {
if (e) alert('after they pressed confirm, but ajax is already sent');
else alert('after they pressed confirm, but ajax is already sent');
});
// no return here
}
根据http://yassershaikh.com/how-to-use-onbegin-method-with-ajax-beginform/返回false应该取消Ajax调用。但是你的功能目前还没有返回任何内容。
所以尼古拉斯的答案可能是唯一正确的答案。
回应你的评论。假设你知道如何阻止js的执行(这是一个可怕的事情!你不应该!)这将为你做到这一点:
// this tells us if use made a choice
var userClicked = false;
// this is for user's choice
var userChoice;
function MyConfirm() {
alertify.confirm("Do you really want to do that??", function (e) {
// mark that user clicked
userClicked = true;
if (e) {
userChoice = true;
} else {
userChoice = false;
}
});
// Put your delay code here
// userClicked tells you that user made a choice
// Remember that setTimout will fail here as it's a fork, not a blocking function
// you will have to do some crazy while loops that will make unicorns cry
userClicked = false;
return userChoice;
}
答案 1 :(得分:0)
我没有使用alertify
,但是从方法签名中,我假设alertify.confirm
立即返回并在用户稍后关闭弹出窗口时运行回调方法。
这意味着您的MyConfirm
方法也会立即返回,如果它没有返回false,则启动ajax调用。
您可以通过始终从false
返回MyConfirm
并仅在alertify.confirm
回调函数中进行ajax调用来解决此问题:
function MyConfirm() {
alertify.confirm("Do you really want to do that??", function (e) {
// this actually makes the ajax call if required
if (e) doAjaxCall();
});
return false;
}