2011-12-12 34 views
4

問題jqGrid的使用都排序中colModel的索引屬性,而不是名稱屬性和搜索

使用的jqGrid顯示錶的數據。表具有外鍵,我們想要顯示其外鍵而不是Id的文本。我也希望該用戶可以對外鍵進行排序和過濾。

  • 人表:ID,姓名,EducationId(教育表的外鍵)
  • 教育能夠:ID,姓名

我們要展示每個人與他/她的教育名稱在jqgrid的名稱。

  1. 如果用戶點擊了教育柱,它的排序按Education Name(不Education Id
  2. 如果用戶希望在教育,篩選,我們展示了一個下拉列表(選擇)包含教育名,用戶以後選擇一個,所述過濾器包含EducationIdsField和選定值的Id作爲sValue

我的解決辦法

var items1 = {@Html.GetEduType()}; 

$(function() { 
     $("#list").jqGrid({ 
      url: '/Home/GridData/', 
      datatype: 'json', 
      mtype: 'GET', 
      colNames: ['Name','Education'], 
      colModel: [ 
      { name: 'Name', index: 'Name' }, 
      { name: 'EducationId', index: 'Education.Name', search: true, 
      stype: 'select', searchoptions: { value: items1, sopt: ['eq', 'ne'] }, 
      formatter: 'select' , editoptions: { value: items1 }}],    
      viewrecords: true}); 
$("#list").jqGrid('filterToolbar', { stringResult: true, searchOnEnter: true }); 
  1. 有了這個代碼,Home/GetData只是發送Person.IdPerson.NamePerson.EducationId爲JSON數據,這是真的好並不比客戶的需求發送更多的數據。它也發送一次Education IdName之間的關係,這些數據用於顯示網格中的名稱而不是id,還用於創建下拉值和文本。
  2. 我忽略寫其他屬性,如尋呼機,pagesize等
  3. @Html.GetEduType()是剃鬚刀服務器端功能。它只是返回像 [Education Id]:[Education Name]對。例如:(1:'Diploma',2:'M.S.',...)(我只是用它來獲得教育數據一次,並沒有使用UrlData) (是的,我用它在ASP.Net MVC 3,但它不是一個很重要的一點)

我的問題: 它很適合顯示數據和根據其名稱對教育進行排序。但是,當我想過濾教育時,它會向服務器發送Http Post sField中的索引值(Education.Name)而不是名稱值(EducationId)。這個問題將通過發送名稱值而不是索引值來解決。

謝謝。

回答

3

我解決我的問題是這樣的:

  1. 首先,我處理beforeSearch事件:

    .filterToolbar({ stringResult: true, beforeSearch: searchPreparation }) 
    
  2. 這裏是searchPreparation功能:

    function searchPreparation(grid) { 
        if (grid == undefined) 
         grid = $(this); 
        else 
         grid = $(grid); 
        var postData = grid.jqGrid('getGridParam', 'postData'); 
        var searchData = jQuery.parseJSON(postData.filters); 
        var gridCol = grid.getGridParam("colModel"); 
        for (var i = 0; i < searchData.rules.length; i++) { 
         for (var j = 0; j < gridCol.length; j++) { 
          if (gridCol[j].index != gridCol[j].name && searchData.rules[i].field == gridCol[j].name) { 
           searchData.rules[i].field == gridCol[j].index; 
           break; 
          } 
         } 
        } 
        grid.jqGrid('setGridParam', { postData: { filters: JSON.stringify(searchData)} }); 
        return false; 
    } 
    

012首先我得到發佈數據並解析它。之後,我搜索他們的索引不等於他們的名字的列,並查找是否有任何這些列的過濾器。如果有任何列,我用索引替換字段。 最後我設置了發佈數據。通知該數據轉換爲JSON與JSON.stringify,你可以找到它here

我使用此功能用於下拉式過濾器數據(使用下拉項目的值不是文本)