1

我有防止回发的代码但失败了。基本上我有一个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;
    }

Web 服务将返回一个布尔值,当我进入代码时它会返回。但是,当我进入 javascript 代码时,我发现“isValid”不是布尔值。它是“未定义的”。为什么?

谢谢。

4

3 回答 3

1

Ajax 是异步的。

var isValid = ValidateUserName();

此行执行,但您正在调用的函数没有返回(因此undefined

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

function ValidateUserName() {
    var returnValue;
    $.ajax({ type: "POST",
        ...
        async: false,
        success: function (data) {
            returnValue = data.d;
        },
        ...
    });
    return returnValue;
}
于 2012-05-02T12:53:23.080 回答
0

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
}

当 ajax 被标记为async:falseajax 调用的结果时包含你的结果。而不是将其传递给成功函数

于 2012-05-02T12:55:18.563 回答
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;
}
于 2012-05-02T12:56:23.157 回答