2014-11-05 3 views
0

Я получаю проблему, так как сервер возвращает 500 ошибок. же URL работает на Когда я использую внутри AJAX вызоваНе удалось загрузить ресурс: сервер ответил со статусом 500 (Внутренняя ошибка сервера) При использовании JqGrid

URL является = "TestService.asmx/GetQueryInfo"

jQuery("#list2").jqGrid({ 
         mtype: 'POST', 
         postData: "{ TableName: '" + TableName + "', ColumnList: '" + ColumnNames + "' }", 
         serializeGridData: function (postData) { 
          // extend the parameter which will be send to the server 
          postData = JSON.stringify(postData); 
          // serialize the parameters as JSON string 
          alert(postData); 
          return JSON.stringify(postData); 
         }, 
         url: "PredictiveDialer.asmx/GetQueryInfo", 
         ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, 
         datatype: 'json', 
         colNames: ['ID', 'Code', 'Name', 'PassWord', 'ClientLevel', 'DeptNo', 'DeptName'], 
         colModel: [ 
          { name: 'id', index: 'id', width: 55 }, 
          { name: 'code', index: 'code', width: 90 }, 
          { name: 'name', index: 'name', width: 100 }, 
          { name: 'password', index: 'password', width: 80, align: "right" }, 
          { name: 'ClientLevel', index: 'ClientLevel', width: 80, align: "right" }, 
          { name: 'DeptNo', index: 'DeptNo', width: 80, align: "right" }, 
          { name: 'DeptName', index: 'DeptName', width: 150, sortable: false } 
         ], 
         rowNum: 10, 
         rowList: [10, 20, 30], 
         pager: '#pager2', 
         sortname: 'id', 
         viewrecords: true, 
         sortorder: "id", 
         caption: "JSON Example", 
         jsonReader: { 
          root: function (obj) { return obj.d; }, 
          page: function() { return 1; }, 
          total: function() { return 1; }, 
          records: function (obj) { alert(obj.d.length); return obj.d.length; } 
         }       
        }); 
        jQuery("#list2").jqGrid('navGrid', '#pager2', { edit: false, add: false, del: false }); 

и WebService код, как показано ниже

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

ли что-то не так с Выше кода?

ОБНОВЛЕНО КОД

Теперь я использовал новую функцию Paise ColumnName с ColumnValue inArray

стороне сервера:

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

ответ

1

Ваш текущий код есть много проблем. Главное: вы преобразовываете данные, возвращенные из GetQueryInfo явно в строку JSON, что неверно. Метод должен возвращать Object вместо String. .Net framework автоматически преобразует возвращаемый объект в строку JSON.

Вторая проблема заключается в неправильном использовании postData. Вы никогда не должны пытаться преобразовать возвращенный объект в JSON вручную (как вы делаете с "{ TableName: '" + TableName + "', ColumnList: '" + ColumnNames + "' }"). Вместо этого вы можете просто удалить postData и изменить код serializeGridData к чему-то вроде

serializeGridData: function() { 
    return JSON.stringify({ 
     TableName: TableName, 
     ColumnList: ColumnNames 
    }); 
} 

Он заменить стандартные параметры, которые будут отправлены, как правило, к серверу TableName и ColumnList.

Вы не должны доверять входным данным в код сервера. Текущая реализация GetQueryInfo является идеальным способом для SQL injection (см., Например, также here). Такой код никогда не должен использоваться в производстве.

Последнее замечание. Вы должны добавить некоторые параметры в jqGrid: loadonce: true (потому что вы не реализовали подкачку данных на стороне сервера), gridview: true (для повышения производительности сетки), autoencode: true (для интерпретации входных данных как текста, а не как HTML-фрагментов). Я рекомендую вам добавить loadError cellback к сетке (см. the answer). Чтобы отобразить сообщение об ошибке в случае ошибок на стороне сервера, таких как 500.

+0

Спасибо За ваш ответ Посмотрите это http://stackoverflow.com/questions/26770284/jqgrid-not-binding-data – Jankya

+1

@RamdasBhosale: Добро пожаловать ! Я полагаю, вы все еще не меняете код DataSetToJSON, как я и предполагал. Я полагаю, что вы все еще используете 'JavaScriptSerializer.JavaScriptSerializer', что неверно. 'GetQueryInfo' methow должен возвращать' Object' вместо 'String'. – Oleg

+0

У меня есть изменение return Datatype From String to object Возвращает Valid Json, но не привязывается к JqGrid – Jankya

Смежные вопросы

 Смежные вопросы