Jquery 加载资源失败:使用JqGrid时,服务器响应状态为500(内部服务器错误)
当服务器返回500错误时,我遇到问题。 当我使用内部ajax调用时,相同的URL正在运行 URL为=“TestService.asmx/GetQueryInfo” Web服务代码如下所示Jquery 加载资源失败:使用JqGrid时,服务器响应状态为500(内部服务器错误),jquery,json,jqgrid,Jquery,Json,Jqgrid,当服务器返回500错误时,我遇到问题。 当我使用内部ajax调用时,相同的URL正在运行 URL为=“TestService.asmx/GetQueryInfo” Web服务代码如下所示 [WebMethod] public String GetQueryInfo(String TableName, String ColumnList) { String daresult = String.Empty; String SQL = String.Empty; Sql
[WebMethod]
public String GetQueryInfo(String TableName, String ColumnList)
{
String daresult = String.Empty;
String SQL = String.Empty;
SqlConnection con = new SqlConnection("MyConnectionString");
SQL = "Select " + ColumnList + " From "+ TableName;
SqlDataAdapter sda = new SqlDataAdapter(SQL, con);
DataSet ds = new DataSet();
sda.Fill(ds);
daresult = DataSetToJSON(ds);
return daresult;
}
public string DataSetToJSON(DataSet ds)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (DataTable dt in ds.Tables)
{
object[] arr = new object[dt.Rows.Count + 1];
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
arr[i] = dt.Rows[i].ItemArray;
}
dict.Add(dt.TableName, arr);
}
JavaScriptSerializer json = new JavaScriptSerializer();
return json.Serialize(dict);
}
您当前的代码有很多问题。主要是:将从
GetQueryInfo
返回的数据显式转换为错误的JSON字符串。方法应该返回对象
,而不是字符串
。Net framework将为您自动将返回的对象转换为JSON字符串
第二个问题是错误使用postData
。您不应该尝试手动将返回的对象转换为JSON(就像您对所做的那样,{TableName:“+TableName+”,ColumnList:“+ColumnNames+”}”
)。相反,您可以删除postData
并将serializeGridData
的代码修改为
serializeGridData:函数(){
返回JSON.stringify({
TableName:TableName,
列列表:列名称
});
}
它将替换标准参数,标准参数通常发送到服务器TableName
和ColumnList
永远不要信任服务器代码中的输入数据。当前实现的GetQueryInfo
是实现的理想方式(参见示例)。此类代码不应在生产中使用
最后一句话。您应该在jqGrid中添加一些选项:
loadonce:true
(因为您没有实现数据的服务器端分页),gridview:true
(为了提高网格的性能),autoencode:true
(为了将输入数据解释为文本而不是HTML片段)。我建议您将loadError
cellback添加到网格中(请参阅)。若要在出现服务器端错误(如500)时显示错误消息。感谢您的回复,请查看此@RamdasBhosale:不客气!我想您仍然没有像我建议的那样更改datasetojson
的代码。我想您仍然使用JavaScriptSerializer.JavaScriptSerializer
,这是错误的GetQueryInfo
methow应该返回Object
ain而不是String
。我已将返回数据类型从String更改为它返回有效Json但不绑定到的对象JqGrid@RamdasBhosale:您应该在问题后附加web方法的更新代码。我仍然认为您使用旧代码,因为d
属性的值是字符串。您可以使用jsonReader
中的root
作为中定义的函数。在这种情况下,它也会在你的情况下工作。所以您可以使用jsonReader:{repeatitems:false,root:function(obj){return typeof obj.d==“string”?$.parseJSON(obj.d):obj.d;},记录:function(obj){return obj.length;},page:function(){return 1;},total:function(){return 1;}
u这很好,数据显示在网格中。那是男人。
[WebMethod]
public String GetQueryInfo(String TableName, String ColumnList)
{
String daresult = String.Empty;
String SQL = String.Empty;
SqlConnection con = new SqlConnection("MyConnectionString");
SQL = "Select " + ColumnList + " From "+ TableName;
SqlDataAdapter sda = new SqlDataAdapter(SQL, con);
DataSet ds = new DataSet();
sda.Fill(ds);
daresult = DataSetToJSON(ds);
return daresult;
}
public string DataSetToJSON(DataSet ds)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (DataTable dt in ds.Tables)
{
object[] arr = new object[dt.Rows.Count + 1];
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
arr[i] = dt.Rows[i].ItemArray;
}
dict.Add(dt.TableName, arr);
}
JavaScriptSerializer json = new JavaScriptSerializer();
return json.Serialize(dict);
}
[WebMethod]
public Object GetQueryInfo(String TableNames, String ColumnList)
{
Object daresult = new Object();
String SQL = String.Empty;
SqlConnection con = new SqlConnection("MyConnection");
SQL = "Select top 2 " + ColumnList + " From " + TableNames;
SqlDataAdapter sda = new SqlDataAdapter(SQL, con);
DataSet ds = new DataSet();
sda.Fill(ds);
daresult = DataTableToJSON(ds.Tables[0]);
//daresult = DataSetToJSON(ds);
return daresult;
}
public object DataTableToJSON(DataTable table)
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow row in table.Rows)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (DataColumn col in table.Columns)
{
dict[col.ColumnName.ToLower()] = row[col];
}
list.Add(dict);
}
return list;
}
jQuery("#list2").jqGrid({
mtype: 'POST',
url: "MyService.asmx/GetQueryInfo",
serializeGridData: function (postData) {
return JSON.stringify({
TableNames: TableName,
ColumnList: ColumnNames
});
},
ajaxGridOptions: { contentType: "application/json; //charset=utf-8" }, //charset=utf-8
datatype: 'json',
colNames: ['ID', 'Code', 'Name', 'PassWord', 'ClientLevel', 'DeptNo', 'DeptName'],
colModel: [
{ name: 'ID', index: "ID", width: 55, key: true, localreader: { id: "ID" } },
{ name: 'Code', width: 90, align: 'left' },
{ name: 'Name', width: 100, align: 'left' },
{ name: 'PassWord', width: 80 },
{ name: 'ClientLevel', width: 80 },
{ name: 'DeptNo', width: 80 },
{ name: 'DeptName', width: 150 }
],
jsonReader: {
repeatitems: false,
root:'d',
page: function (obj) { return 1; },
total: function (obj) { return 1; },
records: function (obj) { return obj.length; },
id : "ID"
},
autoencode: true,
gridview: true,
rowNum: 10,
loadonce: true,
rowList: [10, 20, 30],
pager: '#pager2',
viewrecords: true,
caption: "JSON Example",
loadError: function (jqXHR, textStatus, errorThrown) {
alert('HTTP status code: ' + jqXHR.status + '\n' +
'textStatus: ' + textStatus + '\n' +
'errorThrown: ' + errorThrown);
alert('HTTP message body (jqXHR.responseText): ' + '\n' + jqXHR.responseText);
}
});
jQuery("#list2").jqGrid('navGrid', '#pager2', { edit: false, add: false, del: false });