Ajax.ActionLink和确认对话框

时间:2013-03-27 15:01:44

标签: c# javascript asp.net ajax asp.net-mvc-4

我有一些问题

@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对话框,但它也会立即重新生成,并且“删除”操作开始了!如何处理?

2 个答案:

答案 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; 
 }