3

私はいくつかの問題を抱えています

@Ajax.ActionLink

確認ダイアログを表示したいのですが、はい、できることはわかっています:

@Ajax.ActionLink("Do it!", "Delete", new AjaxOptions(){ Confirm = "Are you sure?" });

しかし、私はalertify
を使用する独自の MyConfirm ダイアログが必要です。

私のコードは次のとおりです。

 @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 ダイアログを表示しますが、すぐに 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 呼び出しが開始されます。

false常にから戻り、コールバック関数MyConfirmで ajax 呼び出しのみを行うことで、これを修正できます。alertify.confirm

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 に答える