2012-06-21 69 views
-1

我有一個圖像按鈕OnClientClick和OnClick事件。

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

的OnClientClick,我調用一些客戶端功能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 $。員額()當我得到響應爲「成功」,我想回到真正的客戶端功能SendLoginData。 因此,我的服務器端onClick可以工作。

但是我面臨着一個問題。 你可以看到有一個警報被評論(// alert(flagLogin);)。

如果我取消註釋警報,那麼如果(flagLogin ==「1」)條件起作用。而如果我留下警報作爲評論,然後如果(flagLogin ==「1」)不起作用。

有人可以解釋我該如何處理這種情況,這背後的原因是什麼?

+2

'$ .post'後面的代碼在'$ .post'回調中的代碼之前執行。考慮閱讀關於AJAX的教程。 – Esailija

+0

也有很大的安全性問題,請參閱我的回答(最後編輯) – Cranio

回答

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的一些查詢字符串中的回調函數來執行我的服務器端代碼,它工作正常。

4

因爲請求是異步的。 AJAX調用不會「等待」完成請求,因此您的「if」在請求完成前執行。

換句話說,當POST請求被處理時,代碼繼續它的執行流程,並且當SendLoginData()函數已經完成時,您的標誌被賦值。

您應該在POST請求內的function (data)位管理登錄成功。


順便說一句:永遠不要依賴於JavaScript來驗證登錄,可以篡改與極端放心。考慮一個徹底的方法改變。

+0

另一個補充:標誌範圍在函數內死亡,所以當執行$ .post成功函數時,它引用另一個不相關的變量。 – Cranio

+0

好吧,那麼如何返回true到SendLoginData()函數? – Gaurav123

+0

此外,我認爲該標誌的範圍不會因爲取消註釋警告而死亡,我可以看到值爲1 – Gaurav123