从jquery ajax调用web方法

时间:2014-01-19 08:15:21

标签: c# jquery asp.net ajax

我试图从jquery调用web方法,但我无法让它工作。请注意,我已经尝试了其他答案中的许多建议,但到目前为止还没有任何工作。

当我从Page_Load调用该方法时,它可以正常工作。只有当我从.ajax()调用它才会失败。我收到“内部服务器错误”,当我在浏览器中调试时,我收到“无法加载资源”。

对于我的生活,我无法弄清楚出了什么问题。任何帮助表示赞赏。

我的ASP代码:

        $(document).ready(function () {
        var iipServ = "http://localhost/fcgi-bin/iipsrv.fcgi";
        var imgDir = String($("#<%= hfImageDir.ClientID %>").val());
        var objData = String($("#<%= hfObjectData.ClientID %>").val());
        var docid = $.url(window.location).param('doc');


        $('#diva-viewer').diva({
            iipServerURL: iipServ,
            objectData: objData,
            imageDir: imgDir,
            tileFadeSpeed: 100,
            fixedHeightGrid: true,
            enableAutoTitle: false,
            enableFullscreen: false,
            contained: true,
            enableAutoHeight: true,
            enableAutoWidth: true,
            enableDownload: true,
            zoomLevel: 2
        });

        Events.subscribe("VisiblePageDidChange", function (pagenumber, fn) {

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "Viewer.aspx/GetTest",
                datatype: "json",       
                data: {docID: JSON.stringify(docid), 
                       pageNumber: JSON.stringify(pagenumber)},
                success: function (response) {

                    alert("YAY!!");
                    alert(response.d);
                    $("#page-data").html(response.d);

                },
                error: function (xhr, status, error) {
                    alert("responseText=" + xhr.responseText + 
                      "\n textStatus=" + status + "\n errorThrown=" + error);
                }                  
            });
        });
    });

从我的代码页面后面,Viewer.aspx.cs:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static String GetTest(string docID, string pageNumber)
    {
        String test = "";
        try
        {
            test = "docID = " + docID + " pageNumber = " + pageNumber;
            var ser = new JavaScriptSerializer();
            Show(ser.Serialize(test));

        }
        catch (Exception ex)
        {
            // Log the exception.
            ArchiveViewer.Logic.ExceptionUtility.LogException(ex, 
                 "GetPages in Viewer.aspx.cs");

        }
        return test;
    }

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

首先,您目前将数据传递给$.ajax,如下所示:

data: {docID: JSON.stringify(docid),
    pageNumber: JSON.stringify(pagenumber)},

对我有用的是改变它:

data: JSON.stringify({docID: docid,
    pageNumber: pagenumber}),

如果没有这种更改,jQuery会将数据作为docId=10&pageNumber=20发送到服务器,这会导致服务器端出现JSON反序列化问题。

其次,你有datatype: "json"。它应该是dataType: "json", - 请注意首都T。也就是说,jQuery会根据从服务器返回的内容猜测这应该是什么,在这种情况下,它总是发回JSON,但仍然。

修改

在jQuery ajax中,contentType属性在请求中设置Content-Type HTTP标头,指示请求正文的MIME类型。

dataType属性在请求中设置Accept标头,指示可接受的响应的MIME类型。

在您的情况下,WebMethods要求内容类型为application/json,因此设置contentType是正确的。

如果您愿意,还可以将dataType设置为json。在这种情况下,实际上并不是必需的,因为jQuery会根据响应的Content-Type标头来猜测它应该是什么。由于您的Web方法配置为始终返回JSON,因此此标头应始终以application/json; charset=utf-8结尾,这意味着jQuery应始终进行正确的猜测。