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

}

我只是无法从我的网络服务中读取返回值。当我打印出回调函数(data参数)中的值时,我得到truefalse(注意前面的空格)。

当我打印出来时data.d,它说undefined。仅供参考,网络服务方法每次都会受到打击。

4

1 回答 1

1

您已dataType指定为text. 这会让我相信你得到的响应实际上是一个字符串,而不是一个布尔值。将 dataType 切换为json会给你一个 Javascript 对象。

编辑:解析器错误的原因是因为您返回的布尔值实际上是一个转换为字符串的 .NET 布尔值。当.ToString()最终被调用以获取实际的 HTTP 响应时,它最终是Trueor False。在 JSON 中,布尔值是truefalse(注意大小写)。当 jQuery 试图解析响应时,它认为它不是一个正确的布尔值并抛出错误。

根据您使用的 ASP.NET 风格,您有几个选择。如果您使用的是 MVC 或 Web API,只需像这样返回:

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

如果您没有使用这些技术中的任何一种,那么最好将返回类型更改为字符串,然后调用:

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

您需要导入System.Web.Script.Serialization命名空间才能使前面的代码片段正常工作。

于 2012-10-12T20:15:34.160 回答