Asp.net aspx和jquery.ajax总是返回一个错误

Asp.net aspx和jquery.ajax总是返回一个错误,asp.net,jquery,webmethod,Asp.net,Jquery,Webmethod,这段代码在mvc2中运行良好,但又回到了传统的ASPX(因为Sharepoint 2010)。我遇到了错误。有人能告诉我这个框架的错误吗 此ajax调用位于$.ready中 $.ajax({ type: "POST", dataType: "json", data: 'siteName=a&siteUrl=b', url: 'Wizard.aspx/DoesNameUrlExist', beforeSend:

这段代码在mvc2中运行良好,但又回到了传统的ASPX(因为Sharepoint 2010)。我遇到了错误。有人能告诉我这个框架的错误吗

此ajax调用位于$.ready中

$.ajax({
        type: "POST",
        dataType: "json",
        data: 'siteName=a&siteUrl=b',
        url: 'Wizard.aspx/DoesNameUrlExist',
        beforeSend: function () { alert("before send"); },
        complete: function () { alert("complete"); },
        success: function (data) { alert("success"); },
        error: function (data) {
            if ($("meta[name=debug]").attr("content") == "true") {
                //Full Error when debugging
                var errDoc = window.open();
                errDoc.document.write(data.responseText);
                errDoc.document.close();
            }
            else {
                // generic error message for production use
                alert("An unexpected error occurred.");
            } return false;
        }
    });
代码隐藏

[WebMethod]
public static string DoesNameUrlExist(string siteName, string siteUrl)
{
    //do something
    return someString;
}

每次我都会收到一个错误。

如果您将
contentType
声明为json,并且响应内容类型不是json,那么jQuery中的Ajax调用总是会给您一个错误。如果来自WebMethod的响应有一些不同的内容(例如html或文本),您将始终收到该错误。您可以在方法上设置该响应类型,如下所示:

[WebMethod]
[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public static string DoesNameUrlExist(string siteName, string siteUrl)
Response.ContentType = "application/json";
在WebMethods之外,也可以这样实现:

[WebMethod]
[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public static string DoesNameUrlExist(string siteName, string siteUrl)
Response.ContentType = "application/json";

您需要向服务发送JSON,并通过
contentType
标题指示您正在这样做:

$.ajax({
    type: "POST",
    contentType: 'application/json',
    data: '{"siteName":"a","siteUrl":"b"}',
    url: 'Wizard.aspx/DoesNameUrlExist',
    beforeSend: function () { alert("before send"); },
    complete: function () { alert("complete"); },
    success: function (data) { alert("success"); },
    error: function (data) {
        if ($("meta[name=debug]").attr("content") == "true") {
            //Full Error when debugging
            var errDoc = window.open();
            errDoc.document.write(data.responseText);
            errDoc.document.close();
        }
        else {
            // generic error message for production use
            alert("An unexpected error occurred.");
        } return false;
    }
});
更多信息请点击此处:


另外,如果您使用的是jQuery 1.4,那么可以删除
数据类型

您知道错误消息是什么吗?因为他正在调用一个page方法,所以输入参数需要JSON,并且它也会自动在响应上设置
应用程序/JSON
内容类型。不需要手动操作。我认为只有在您指定json的情况下才需要json作为输入。我们过去使用过pageMethods,但没有传入JSONY,如果没有参数,您可能会侥幸逃脱,但您必须将JSON输入参数与静态“page methods”和ASMX“ScriptServices”一起使用。您可能没有注意到,在过去,如果您使用ScriptManager通过PageMethod.YourMethodName()语法调用页面方法。在这种情况下,MicrosoftAjax.js会自动处理客户端JSON序列化。好吧,那么,当您启动ajax调用来判断是正常的页面提交回发还是ajax调用时,最好的方法是什么?似乎我的ajax调用和表单提交正在发回。我理解表单提交应该是这样的,但我不认为ajax调用最终会出现在Page_Load事件中。有代码示例吗?我的代码从未自动命中WebMethods。您需要在aspx页面上安装scriptmanager吗?@Anthony:如果您不使用内容类型为application/json的POST请求,则对页面方法的调用将在页面加载事件中结束,因为否则它不会命中页面方法。您不需要脚本管理器。你试过我答案中的密码了吗?这是通过jQuery调用页面方法必须采用的方法。