ajax jquery json returns 500 internal server error (undefined) but webmethod works
我刚接触过jquery和json,我想知道为什么getareas()函数返回500/内部服务器错误-未定义。我检查了webMethod,它正在返回数据,getRegions()函数工作正常。vs项目构建得很好。有什么想法吗?代码如下:
C服务器端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [WebMethod] public static ArrayList GetRegionsArrayList() { ArrayList arrayList = new ArrayList(); foreach (DataRow dr in Utility.Regions().Rows) { arrayList.Add(new ListItem(dr["Region"].ToString(), dr["Dot4"].ToString())); } return arrayList; } [WebMethod] public static ArrayList GetAreasArrayList(string Dot4) { ArrayList arrayList = new ArrayList(); foreach (DataRow dr in Utility.Areas(Dot4).Rows) { arrayList.Add(new ListItem(dr["Area"].ToString(), dr["Dot6"].ToString())); } return arrayList; } |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <script type="text/javascript" language="javascript"> function PopulateControl(list, control) { if (list.length > 0) { control.removeAttr("disabled"); control.empty().append('<option selected="selected" value="0">Please select</option>'); $.each(list, function () { control.append($("<option></option>").val(this['Value']).html(this['Text'])); }); } else { control.empty().append('<option selected="selected" value="0">Not available<option>'); } } function getRegions() { $.ajax({ type:"POST", url:"Demo.aspx/GetRegionsArrayList", data:"{}", contentType:"application/json; charset=utf-8", dataType:"json", success: OnRegionsPopulated, error: function (response) { alert(response.status + ' ' + response.statusText); }, failure: function (response) { alert(response.d); } }); } function getAreas() { $.ajax({ type:"POST", url:"Demo.aspx/GetAreasArrayList", data:"{Dot4: ' + $('#<%=DDL_Region.ClientID%>').val() + '}", contentType:"application/json; charset=utf-8", dataType:"json", success: OnAreasPopulated, error: function (response) { alert(response.status + ' ' + response.statusText); }, failure: function (response) { alert(response.d); } }); } function OnRegionsPopulated(response) { PopulateControl(response.d, $("#<%=DDL_Region.ClientID%>")); } function OnAreasPopulated(response) { PopulateControl(response.d, $("#<%=DDL_Area.ClientID%>")); } |
控制
1 2 3 | <select id="Select1" onchange="getRegions();"> <select id="DDL_Region" onchange="getAreas();" runat="server"></select> <select id="DDL_Area" runat="server"></select> |
错误详细信息:
{"Message":"Invalid JSON primitive: Dot4.","StackTrace":" at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32
depth)at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String
input, Int32 depthLimit, JavaScriptSerializer serializer)at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer
serializer, String input, Type type, Int32 depthLimit)at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String
input)at
System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext
context, JavaScriptSerializer serializer)at
System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData
methodData, HttpContext context)at
System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext
context, WebServiceMethodData
methodData)","ExceptionType":"System.ArgumentException"}
这已经很晚了,但它可能会帮助一些旅行者……我也发现,使用XML工作正常的Web方法在作为JSON处理时可能会产生"内部服务器错误"。
在我的所有案例中,这都归结为以下其中之一。
1)我的类在序列化时出现问题。我使用[xmlignore]从XML序列化中排除的一些东西在JSON中产生了问题(比如循环引用)。我用[scriptIgnore]属性修复了这个问题。
2)在将JSON参数构建到Web方法中的客户端JavaScript中,我遇到了一个问题。在这种情况下,服务器返回一个"500内部服务器错误",我发现这是误导性的,并且坦率地说是不正确的。这不是内部服务器错误,而是错误的客户机请求。
查看上面的代码,问题可能只是"dot4"需要加引号(它是一个"无效的json原语",与错误消息的状态完全相同)。但是,由于错误消息给出了"内部服务器错误",所以您开始了一个漫长的旅程,寻找服务器中的问题,而不是客户机中的问题。