2012-06-21 2 views
-1

У меня есть одна кнопка изображения с событиями OnClientClick и OnClick.

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

OnClientClick, я называю некоторую функцию на стороне клиента SendLoginData(), где я использовал $ .post() функцию.

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() Когда я получаю ответ, как «УСПЕХ», я хочу, чтобы вернуть верную сторону клиента функции SendLoginData. Так что моя серверная сторона onClick может работать.

Но я столкнулся с одной проблемой. Вы можете видеть, что есть одно предупреждение, которое прокомментировано (// alert (flagLogin);).

Если я раскомментирую предупреждение, то работает условие (flagLogin == "1"). тогда как если бы я оставил предупреждение как комментарий, то if (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() уже завершена.

Вы должны управлять успехом входа в бит function (data) внутри запроса POST.


Кстати: НИКОГДА НЕ полагаться на JavaScript для проверки входа, он может быть подделан с крайней легкостью. Рассмотрим радикальный подход.

+0

Другое дополнение: область действия флага умирает внутри функции, поэтому, когда функция успеха $ .post выполняется, она ссылается на другую, несвязанную переменную. – Cranio

+0

ok, так как вернуть true функции SendLoginData()? – Gaurav123

+0

Кроме того, я думаю, что область действия флага не умирает, потому что после расторжения оповещения я могу видеть значение до 1 – Gaurav123