Jquery 加载资源失败:使用JqGrid时,服务器响应状态为500(内部服务器错误)

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

当服务器返回500错误时,我遇到问题。 当我使用内部ajax调用时,相同的URL正在运行

URL为=“TestService.asmx/GetQueryInfo”

Web服务代码如下所示

[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 });