我使用.NET 2.0在文件default.aspx.vb中有以下页面方法:
<WebMethod()> _
Public Shared Function GetStatisticData(ByVal userId As Integer) As JavaScriptSerializer
Dim stats As JavaScriptSerializer = New JavaScriptSerializer()
stats.Serialize(statBiz.GetAllSaleStatistics(userId))
Return stats
End Function
在default.aspx
中opt.ajax({
type: "POST",
url: 'default.aspx/GetStatisticData',
data: "{userId: 6601}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
console.log(data);
},
error: function (request, status, error, response) {
console.log(error);
}
});
但是codebehind文件中的方法永远不会被命中,我从控制台日志中得到了这个错误:
SyntaxError: Unexpected token < in JSON at position 2
at JSON.parse (<anonymous>)
at n.parseJSON (jquery-1.12.4.min.js:11)
at Xb (jquery-1.12.4.min.js:11)
at y (jquery-1.12.4.min.js:11)
at XMLHttpRequest.c (jquery-1.12.4.min.js:11)
有人能告诉我这里缺少什么吗?
答案 0 :(得分:1)
有人能告诉我这里缺少什么吗?
对于初学者,您的返回类型应该是statBiz.GetAllSaleStatistics
的返回类型,并且应该返回该调用的结果。您不需要自己启动序列化程序,当Framework能够根据请求标头确定要启动哪个序列化程序时,无需将自己绑定到返回JSON。你当然不应该试图返回JavaScriptSerializer
。
此示例代码和输出应说明返回序列化器无法工作的原因:
Dim js = New JavaScriptSerializer()
js.Serialize(New List(Of Int32) From { 1, 2, 3})
Console.WriteLine(New JavaScriptSerializer().Serialize(js))
{&#34; MaxJsonLength&#34;:2097152,&#34; RecursionLimit&#34;:100}
那不是序列化列表!它是一个序列化的序列化器!
为了说明的目的,我们假设statBiz.GetAllSaleStatistics(userId)
返回SaleStatistics
类的实例。请尝试以下操作,但当然会将SaleStatistics
替换为您的实际类型:
<WebMethod()> _
Public Shared Function GetStatisticData(ByVal userId As Integer) As SaleStatistics
Return statBiz.GetAllSaleStatistics(userId)
End Function
这本身可能无法完全解决您的问题。我怀疑你的方法是返回XML而且作为遗留应用程序可能有entries missing from web.config。您可能还需要以.NET Framework 3.5为目标。
答案 1 :(得分:0)
Web服务使用Web方法,而不是Web应用程序。在服务器上安装Web服务,并在将Web服务添加为服务后,在代码中调用(SOAP)Web服务。 Web服务文件的扩展名为.asmx。 Web服务有点陈旧(.NET Framwork 2.0到3.5),大多数人都使用RESTful api。要创建Web服务,请转到文件 - &gt;新增 - &gt; Asp.Net空Web应用程序。在右键单击 - &gt;添加新项目 - &gt; webservice模板。
现在,如果你不喜欢这个答案并且仍想使用你的代码,请从代码中删除webmethod_
,在javascript中,你可以使用'<%= GetStatisticData(SomeVariableStoringUserID) %>'
传递将调用结果分配给变量在您要查询的用户标识中。
更新:至少可以说,似乎我有点落后于时代。所以@Stephen Kennedy在这方面的回答似乎是正确的。当我认为您期待json文档时,您的方法会返回JavaScriptSerializer
。