-1

OnClientClick および OnClick イベントを持つ画像ボタンが 1 つあります。

        <asp:ImageButton ImageUrl="./../../images/login.gif" Style="margin-right: 153px;"
        runat="server" OnClientClick="return SendLoginData();" OnClick="Login_Click" />

OnClientClick で、$.post() 関数を使用したクライアント側関数 SendLoginData() を呼び出します。

    function SendLoginData() {
        var flagLogin = "0";
        if (LoginValidation() != false) {
            $.post(window.location,
                {
                    LOGIN: "LOGIN",
                    UserName: $.trim($('#txtUserNameLogin').val()),
                    Password: $.trim($('#txtPasswordLogin').val())
                },
                function (data) {

                    var d = $(data).find('#<%=lblMessageLogin.ClientID %>');
                    if ($(d).html() == "SUCCESS") {
                        flagLogin = "1";
                    }
                    else {
                        $('#lblErrorMsgLogin').html(d.html());
                    }
                }
            );
        }
        //alert(flagLogin);
        if (flagLogin == "1") {
            return true;
        }
        else {
            return false;
        }
    }

$.post() の後、"SUCCESS" というレスポンスが返ってきたら、クライアント側関数 SendLoginData に true を返したい。私のサーバー側のonClickが機能するように。

しかし、私は1つの問題に直面しています。コメントされた 1 つのアラートがあることがわかります ( //alert(flagLogin);)。

アラートのコメントを外すと、if (flagLogin == "1") 条件が機能します。一方、コメントとしてアラートを残した場合、if (flagLogin == "1") は機能しません。

誰かがこの状況をどのように処理できるか、またこの背後にある理由を説明できますか?

4

2 に答える 2

4

リクエストは非同期であるため。AJAX呼び出しはリクエストの完了を「待機」しないため、リクエストが完了する前に「if」が実行されます。

つまり、POSTリクエストが処理されている間、コードは実行フローを継続し、SendLoginData()関数がすでに終了するとフラグが評価されます。

function (data)POSTリクエスト内のビットでログインの成功を管理する必要があります。


ちなみに、ログインの検証にJavaScriptを使用しないでください。非常に簡単に、改ざんされる可能性があります。根本的なアプローチの変更を検討してください。

于 2012-06-21T12:03:50.033 に答える
0

以下のコードを使用して、この種のシナリオを解決しました

    function SendLoginData() {
        var flagLogin = "0";
        if (LoginValidation() != false) {

            $.post(window.location,
                {
                    LOGIN: "LOGIN",
                    UserName: $.trim($('#txtUserNameLogin').val()),
                    Password: $.trim($('#txtPasswordLogin').val())
                },
                function (data) {

                    var d = $(data).find('#<%=lblMessageLogin.ClientID %>');
                    if ($(d).html() == "SUCCESS") {
                        flagLogin = "1";
                        window.location = window.location + "?HOME=true";
                    }
                    else {
                        $('#lblErrorMsgLogin').html(d.html());
                    }
                }
            );

        }
        if (flagLogin == "1") {
            return true;
        }
        else {
            return false;
        }
    }

ここでは、コールバック関数でいくつかのクエリ文字列を使用してwindow.locationを使用してサーバー側のコードを実行しましたが、正常に機能しています。

于 2012-06-22T07:38:09.323 に答える