【问题标题】:jQuery AJAX call to an ASP.NET WebMethod对 ASP.NET WebMethod 的 jQuery AJAX 调用
【发布时间】: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”?你应该看到完整的响应对象是什么,看看它是否给你来自服务器的任何错误消息。

标签: c# jquery ajax webmethod


【解决方案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”。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多