对 ASP.NET WebMethod 的 jQuery AJAX 调用

Posted

技术标签:

【中文标题】对 ASP.NET WebMethod 的 jQuery AJAX 调用【英文标题】:jQuery AJAX call to an ASP.NET WebMethod 【发布时间】:2011-12-07 21:54:31 【问题描述】:

我有以下 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 请求返回“未定义”。

谁能告诉我为什么会这样以及问题出在哪里?

谢谢。

【问题讨论】:

什么是未定义的,“response”或“response.d”?你应该看到完整的响应对象是什么,看看它是否给你来自服务器的任何错误消息。 【参考方案1】:

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

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

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

另外,因为您的代码不再阻塞,您应该确保如果您通过单击某个按钮或表单提交调用此 sendUpdate,您会通过返回 false 来取消默认操作。

【讨论】:

【参考方案2】:

我的方法正确:

[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
    );

然后,调用使用(在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>');
    );

【讨论】:

【参考方案3】:

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

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

更正后的数据选项是:

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

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

【讨论】:

以上是关于对 ASP.NET WebMethod 的 jQuery AJAX 调用的主要内容,如果未能解决你的问题,请参考以下文章

从 javascript 调用 webmethod 时出现 ASP.NET 500 内部服务器错误

如何将json字符串传递给webmethod c# ASP.NET

从 ASP.NET Webservice 中删除了 WebMethod,方法仍然显示

使用 jQuery 将 JSON 对象成功发送到 ASP.NET WebMethod

ASP.NET 静态 WebMethod 下载文件 [重复]

ASP.NET使用WebMethod