0

私は次のjQueryコードを持っています:

var isUsernameAvailable = false;

function CheckUsername(uname) {
        $.ajax({
            method: "POST",
            url: "IsUsernameAvailable.asmx/IsAvailable",
            data: { username: uname },
            dataType: "text",
            success: OnSuccess,
            error: OnError
        });     // end ajax
    }   // end CheckUsername
    function OnSuccess(data) {            
        if (data == true) {    // WHY CAN'T I TEST THE VALUE
            isUsernameAvailable = true;
        } else {
            isUsernameAvailable = false;
            $('#error').append('Username not available');
        }
    }
    function OnError(data) {
        $('#error').text(data.status + " -- " + data.statusText);            
    }

そして、単純なWebサービス:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following     line. 
[System.Web.Script.Services.ScriptService]
public class IsUsernameAvailable : System.Web.Services.WebService {

    public IsUsernameAvailable () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public bool IsAvailable(string username) {
        return (username == "xxx");
    }

}

Webサービスからの戻り値を読み取れません。コールバック関数(dataパラメーター)の値を出力すると、trueまたはfalse(前の空白に注意してください)を取得します。

印刷するdata.dと、と表示されますundefined。参考までに、Webサービス方式は毎回ヒットします。

4

1 に答える 1

1

dataTypeとして指定されていますtext。これにより、取得する応答は実際には文字列であり、ブール値ではないと私は信じます。dataTypeをに切り替えるjsonと、Javascriptオブジェクトが得られます。

編集:パーサーエラーの理由は、返されるブール値が実際には文字列に変換された.NETブール値であるためです。最終.ToString()的に実際のHTTP応答に対して呼び出されると、最終的にはTrueまたはになりFalseます。JSONでは、ブール値はtrueorですfalse(大文字と小文字が区別されます)。jQueryが応答を解析しようとすると、それが正しいブール値であるとは見なされず、エラーがスローされます。

使用しているASP.NETフレーバーに応じて、いくつかのオプションがあります。MVCまたはWebAPIを使用している場合は、次のように返します。

return Json(username == "xxx", JsonRequestBehavior.AllowGet);

これらのテクノロジーのいずれも使用していない場合は、リターンタイプを文字列に変更してから、次のコマンドを呼び出すのが最適な場合があります。

return new JavaScriptSerializer().Serialize(username == "xxx");

System.Web.Script.Serialization前のコードスニペットを機能させるには、名前空間をインポートする必要があります。

于 2012-10-12T20:15:34.160 に答える