Javascript 阻止回发失败:isValid=";“未定义”;

Javascript 阻止回发失败:isValid=";“未定义”;,javascript,jquery,asp.net,ajax,json,Javascript,Jquery,Asp.net,Ajax,Json,我有防止回发的代码,但失败了。基本上我有一个asp.net按钮 <asp:Button ID="btnSave" runat="server" Text="SaveChanges" OnClick="btnSave_Click" CssClass="saveButton" ValidationGroup="answer" OnClientClick="return ValidateUserNameBeforeSubmitting();" /> 和ajax调用we

我有防止回发的代码,但失败了。基本上我有一个asp.net按钮

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

和ajax调用web服务

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;
    }
函数ValidateUserName(){
$.ajax({type:“POST”,
url:“../UserNameWebService.asmx/ValidateUserName”,
数据:“{'strUsername':'”+JSON.stringify($(“#”).val())+“}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:false,
成功:功能(数据){
返回数据d;
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
}
函数ValidateUserNameBeforeSubmitting(){
var isValid=ValidateUserName();
返回有效;
}
web服务将返回一个布尔值,当我进入代码时会返回。 然而,当我进入javascript代码时,我发现“isValid”不是一个布尔值。它是“未定义的”。 为什么?

谢谢

Ajax是异步的

var isValid=ValidateUserName()

此行执行,但您调用的函数没有返回(因此
未定义

如果要访问从ajax返回的变量,它需要位于成功处理程序中

function ValidateUserName() {
    var returnValue;
    $.ajax({ type: "POST",
        ...
        async: false,
        success: function (data) {
            returnValue = data.d;
        },
        ...
    });
    return returnValue;
}
Ajax是异步的

var isValid=ValidateUserName()

此行执行,但您调用的函数没有返回(因此
未定义

如果要访问从ajax返回的变量,它需要位于成功处理程序中

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

isValid
未定义,因为
ValidateUserName()
实际上不返回任何内容

将ajax调用更改为

 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
}
函数ValidateUserName(){
var results=$.ajax({type:“POST”,
url:“../UserNameWebService.asmx/ValidateUserName”,
数据:“{'strUsername':'”+JSON.stringify($(“#”).val())+“}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
异步:false
});
返回结果;
//或者results.d;如果这是布尔运算所需要的
}

当ajax标记为
async:false
时,ajax调用的结果包含您的结果。不是将其传递给成功函数,而是未定义
isValid
,因为
ValidateUserName()
实际上不返回任何内容

将ajax调用更改为

 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
}
函数ValidateUserName(){
var results=$.ajax({type:“POST”,
url:“../UserNameWebService.asmx/ValidateUserName”,
数据:“{'strUsername':'”+JSON.stringify($(“#”).val())+“}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
异步:false
});
返回结果;
//或者results.d;如果这是布尔运算所需要的
}

当ajax标记为
async:false
时,ajax调用的结果包含您的结果。不要将其传递给success函数

定义一个返回变量,以便所有路径都返回,并确保ajax调用返回bool:

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;
}
函数ValidateUserName(){
var result=false;//默认值
$.ajax({type:“POST”,
url:“../UserNameWebService.asmx/ValidateUserName”,
数据:“{'strUsername':'”+JSON.stringify($(“#”).val())+“}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:false,
成功:功能(数据){
result=data.d;//确保这是一个bool
//result=Boolean(data.d);//但不建议在返回字符串时使用此选项
警惕(结果);//你是笨蛋吗?
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
返回结果;
}
函数ValidateUserNameBeforeSubmitting(){
var isValid=ValidateUserName();
返回有效;
}

确定返回变量的范围,以便所有路径都返回,并确保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;
}
函数ValidateUserName(){
var result=false;//默认值
$.ajax({type:“POST”,
url:“../UserNameWebService.asmx/ValidateUserName”,
数据:“{'strUsername':'”+JSON.stringify($(“#”).val())+“}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:false,
成功:功能(数据){
result=data.d;//确保这是一个bool
//result=Boolean(data.d);//但不建议在返回字符串时使用此选项
警惕(结果);//你是笨蛋吗?
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
返回结果;
}
函数ValidateUserNameBeforeSubmitting(){
var isValid=ValidateUserName();
返回有效;
}

尝试在成功函数中添加警报,并检查是否返回bool值。这可能与您的代码隐藏有关。
UserNameWebService.asmx/ValidateUserName
的返回值可能不是您想要的值。你能发布这个函数正在做什么吗?尝试在成功函数中添加警报,并检查是否返回bool值。这可能与你的代码隐藏有关。
UserNameWebService.asmx/ValidateUserName
的返回值可能不是您想要的值。您可以发布此函数正在执行的操作吗?使用
async:false
等待函数在服务器端执行,然后再执行其他操作使用
async:false
等待函数在服务器端执行,然后再执行其他操作这取决于其代码隐藏函数的工作方式,如果返回值为JSON,它需要一个
success:
函数来解析正确的代码