我试图从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;
}
答案 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应始终进行正确的猜测。