3

我有一些问题

@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 请求停止并且我的“ Delete ”操作不会启动(因此它应该按照它应该的方式工作)。但在我的示例函数MyConfirm()中显示我的 MyConfirm 对话框,但它也立即返回 true 并且“删除”操作开始!如何处理?

4

2 回答 2

2

根据:Javascript Alertify 并从确认返回

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;
}
于 2013-03-27T15:28:53.500 回答
0

我没有使用过alertify,但是从方法签名来看,我假设它会alertify.confirm立即返回并在用户稍后关闭弹出窗口时运行回调方法。

这意味着您的MyConfirm方法也立即返回,如果它没有返回 false,则启动 ajax 调用。

您可以通过始终返回来解决此问题falseMyConfirm并且仅在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; 
 }
于 2013-03-27T15:24:40.460 回答