JqGrid использует свойство индекса colModel вместо имени свойства во время сортировки и поиска - PullRequest
4 голосов
/ 12 декабря 2011

Вопрос

использование jqgrid для отображения данных таблицы. Таблица имеет внешний ключ, и мы хотим показать текст ее внешнего ключа вместо Id. Я также хочу, чтобы пользователь мог сортировать и фильтровать внешние ключи.

Пример

  • Таблица личности: Id, Name, EducationId (внешний ключ для таблицы образования)
  • Образование: Id, Name

Мы хотим показать каждому человеку с именем его / ее образования имя в jqgrid.

  1. Если пользователь щелкнет по столбцу образования, он будет отсортирован по Education Name (Не Education Id)
  2. Если пользователь хочет отфильтровать образование, мы показываем выпадающий список (селектор), который содержит имена образования, после того, как пользователь выбрал одно, фильтр содержит EducationId как sField и 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.Id, Person.Name, Person.EducationId в виде данных json, и очень полезно не отправлять больше данных, чем требуется клиенту. Также он отправляет отношение между Education Id и Name один раз, и эти данные используются для отображения имени вместо идентификатора в сетке, а также для создания выпадающего значения и текста.
  2. Я игнорирую, чтобы написать другие свойства, такие как пейджер, размер страницы и т. Д.
  3. @Html.GetEduType() - функция на стороне сервера бритвы. Он просто возвращает пары, как [Education Id]:[Education Name]. Например: (1:'Diploma',2:'M.S.',...) (я просто использую его для получения данных об образовании один раз, а не UrlData) (Да, я использую его в ASP.Net MVC 3, но это не важный момент)

Моя проблема : Это прекрасно работает для отображения данных и сортировки образования по названию. Но когда я хочу фильтровать образование, он отправляет значение индекса (Education.Name) вместо значения имени (EducationId) в Http Post sField на сервер. Эта проблема будет решена путем отправки значения имени вместо значения индекса.

Спасибо.

1 Ответ

3 голосов
/ 12 марта 2012

Я решил свою проблему следующим образом:

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

В searchPreparation сначала я получаю данные почты и анализирую их. После этого я ищу столбцы, что их индексы не равны их имени, и нахожу, есть ли какой-нибудь фильтр с этими столбцами. Если есть какой-либо столбец, я заменяю поле на индекс. Наконец я установил данные поста. Сообщите, что данные преобразуются в Json с помощью JSON.stringify, чтобы найти их здесь .

Я также использую эту функцию для фильтрации данных с раскрывающимся списком (используйте значение раскрывающихся элементов, а не текст)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...