2012-05-02 6 views
1

ポストバックを防止するコードがありますが失敗しました。基本的に私はasp.netボタンを持っています。ポストバックが失敗するのを防ぐには:isValid = "undefined"

<asp:Button ID="btnSave" runat="server" Text="SaveChanges" OnClick="btnSave_Click" 
     CssClass="saveButton" ValidationGroup="answer" OnClientClick="return ValidateUserNameBeforeSubmitting();" /> 

そしてajaxコールウェブサービス。

function ValidateUserName() { 
     $.ajax({ type: "POST", 
      url: "../UserNameWebService.asmx/ValidateUserName", 
      data: "{'strUsername': '" +JSON.stringify($("#<%=TextUserName.ClientID%>").val()) + "'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 

      async: false, 
      success: function (data) { 
       return data.d; 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert(xhr.status); 
       alert(thrownError); 
      } 
     }); 
    } 


    function ValidateUserNameBeforeSubmitting() { 
     var isValid = ValidateUserName(); 
     return isValid; 
    } 

Webサービスはブール値を返し、コードにステップインします。 しかし、私がJavaScriptコードを踏んだとき、 "isValid"はブール値ではないことがわかりました。それは "未定義"です。 なぜですか?

ありがとうございました。

+0

試してみて、ブール値が返されたかどうかを確認。 – Ravia

+0

おそらくコードビハインドと関係があります。 'UserNameWebService.asmx/ValidateUserName'の戻り値はあなたが望むものではないかもしれません。この機能が何をしているのか投稿できますか? – DangerMonkey

答えて

1

Ajaxは非同期です。

var isValid = ValidateUserName();

この行が実行されますが、あなたが呼んでいる機能・ノーリターン(したがってundefined

あなたがアヤックスから返された変数にアクセスしたい場合は、それが成功ハンドラであることが必要がありません。

function ValidateUserName() { 
    var returnValue; 
    $.ajax({ type: "POST", 
     ... 
     async: false, 
     success: function (data) { 
      returnValue = data.d; 
     }, 
     ... 
    }); 
    return returnValue; 
} 
+0

'async:false'を使用してサーバ側で関数が実行されるのを待ってから何かを実行します – DangerMonkey

0

isValidValidateUserName()は、実際には何も返さないので、未定義です。

変更AjaxはAJAX呼び出しの結果は、あなたの結果が含まれていasync:falseとしてマークされているこの

function ValidateUserName() { 

     var results = $.ajax({ type: "POST", 
     url: "../UserNameWebService.asmx/ValidateUserName", 
     data: "{'strUsername': '" +JSON.stringify($("#<%=TextUserName.ClientID%>").val()) + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 

     async: false 
    }); 

    return results; 
    //or results.d; if thats what you need for the boolean 
} 

へのAJAX呼び出し。むしろそれが成功機能

+0

コードビハインド機能の仕方によって異なります。返り値がJSONの場合、' success: '関数が必要です適切な値を解析する。 – DangerMonkey

+0

@DangerMonkeyしたがって、JSON値を同期呼び出しから戻して解析する方法はありますか?私は、それが成功関数を実行するのではなく、値を返すべきであるということに注意しました。 – Chris

+0

@DangerMonkey ahaは私自身の[質問](http://stackoverflow.com/questions/933713/is-there-a-version-of-getjson-that-doesnt-use-a-call-back)に答えました。 – Chris

0

範囲戻り変数に渡されるよりもので、すべてのパスが戻り、あなたのAJAX呼び出しがブール値を返すことを確認してください:成功の機能にアラートを追加する

function ValidateUserName() { 
    var result = false; //default 
    $.ajax({ type: "POST", 
     url: "../UserNameWebService.asmx/ValidateUserName", 
     data: "{'strUsername': '" +JSON.stringify($("# <%=TextUserName.ClientID%>").val()) + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, 
     success: function (data) { 
      result = data.d; //make sure this is a bool 
      //result = Boolean(data.d); //use this if returning a string, not recommended though 
      alert(result); //are you a bool? 
     }, 
     error: function (xhr, ajaxOptions, thrownError) {    
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 

    return result; 
} 


function ValidateUserNameBeforeSubmitting() { 
    var isValid = ValidateUserName(); 
    return isValid; 
}