-1

我有一个带有 OnClientClick 和 OnClick 事件的图像按钮。

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

Afer $.post() 当我得到响应为“SUCCESS”时,我想向客户端函数 SendLoginData 返回 true。这样我的服务器端 onClick 就可以工作了。

但我面临一个问题。你可以看到有一个被注释的警报 (//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 回答