jQuery AJAX调用ASP.NET WebMethod

时间:2011-10-14 16:29:54

标签: c# jquery ajax webmethod

我有以下jQuery AJAX请求:

function sendUpdate(urlToSend) {
    var code = AccessCode; 
    var url = urlToSend;
    var options = { error: function(msg) { alert(msg.d); },
                    type: "POST", url: "webmethods.aspx/UpdatePage",
                    data: "{ accessCode: " + code + ", newURL: '" + url + "' }",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: true, 
                    success: function(response) { var results = response.d; } }; 
    $.ajax(options);
}

以及相应的ASP.NET WebMethod:

[WebMethod]
public static bool UpdatePage(string accessCode, string newURL)
{
    bool result = true;
    try
    {
        HttpContext.Current.Cache[accessCode + "l"] = newURL;
    }
    catch
    {
        result = false;
    }

    return result;
}

所有这些都曾经与“async:false”正常工作,但是我必须摆脱它,因为它会冻结浏览器,直到收到响应。现在上面的AJAX请求返回“undefined”。

有人可以告诉我它为什么会发生以及问题出在哪里?

感谢。

3 个答案:

答案 0 :(得分:5)

您应该确保正确编码此JSON。 JSON.stringify是最可靠的方法:

data: JSON.stringify({ accessCode: code, newURL: url })

这确保即使codeurl变量包含一些危险的字符,这些字符会在最终生成的JSON中破坏字符串连接,所有内容都将被正确编码。 JSON.stringify方法是自然内置于现代浏览器中的,但如果您需要支持旧版,则可以包含json2.js

另外,因为您的代码不再阻止,所以如果您从某个按钮单击或表单提交中调用此sendUpdate,则应通过返回false来取消默认操作。

答案 1 :(得分:1)

我的方式正常:

[System.Web.Services.WebMethod()] 

        public static string getHello(string str)
        {
            //do some things with str   
            return str;
        }

在文件.js中,我定义了这个函数来调用文件.cs中的webmethod:

function CallServerFunction(StrPriUrl, ObjPriData, CallBackFunction) {

    $.ajax({
        type: "post",
        url: StrPriUrl,
        contentType: "application/json; charset=utf-8",
        data: ObjPriData,
        dataType: "json",
        success: function (result) {
            if (CallBackFunction != null && typeof CallBackFunction != 'undefined') {
                CallBackFunction(result);
            }

        },
        error: function (result) {
            alert('error occured');
            alert(result.responseText);
            window.location.href = "FrmError.aspx?Exception=" + result.responseText;
        },
        async: true
    });
}

然后,调用use(在file.js中调用):

 var text = $("#textbox_send").val();

    var myresult;
    CallServerFunction("Default.aspx/getHello", JSON.stringify({ str: text }), function (myresult) {
        if (text != "")
            $('#' + id).append('<p>' + $("#account_user").text() + ': ' + myresult.d + '</p>');
    });

答案 2 :(得分:0)

“未定义”可能是服务器错误的结果。如果您使用Firebug,Firefox(或任何好的客户端调试工具),您可以找到服务器返回的错误。粘贴错误(如果有)。

尽管如此,我还注意到“accessCode”的“数据”未正确包含在引号''

更正后的数据选项为:

data: "{ accessCode: '" + code + "', newURL: '" + url + "' }",

PS: 由于'选项'在Jquery中有不同的含义,我建议将变量名称更改为'setting'。将'var options'更改为'var settings'。 :)