Лучший способ изменить jqGrid rowNum с ALL на -1 перед передачей в веб-сервис - PullRequest
4 голосов
/ 16 июня 2010

Я ищу, чтобы найти лучший способ разрешить пользователям выбирать показывать ВСЕ записи в jqGrid.Я знаю, что значение -1, передаваемое для параметра строки, обозначает ВСЕ, но я хочу, чтобы слово «ВСЕ», а не -1, появлялось в элементе выбора rowList, т.е.rowList: [15, 50, 100, 'ALL'].

Я передаю запрос сетки в веб-сервис, который принимает int для "строк", и я пытаюсь найти, как и когда яследует изменить выбранное пользователем значение «ВСЕ» на -1, прежде чем оно будет отправлено в веб-службу.

Ниже приведен мой очищенный код сетки.Я пробовал несколько различных блоков кода перед моим $ .ajax в функции типа данных.Но большинству попыток казалось, что я должен делать это самым запутанным способом, каким только мог.Например,

datatype: function(postdata) {
   if ($("#gridTableAssets").jqGrid('getGridParam', 'rowNum') == 'ALL') {
      $("#gridTableAssets").appendPostData({ "rows": -1, "page": 1 });
   }
   $.ajax({...

Но выполнение этого, казалось, приводило к тому, что фактический "page" GridParam обнулялся при последующих действиях сетки, заставляя меня обрабатывать это в других местах.Просто кажется, что это что-то, что часто делается там и имеет чистый способ сделать это.

Код очищенной сетки:

$("#gridTableAssets").jqGrid({
    datatype: function(postdata) {
       $.ajax({
           url: "/Service/Repository.asmx/GetAssets",
           data: JSON.stringify(postdata),
           type: 'POST',
           contentType: "application/json; charset=utf-8",
           error: function(XMLHttpRequest, textStatus, errorThrown) {
              alert('error');
           },
           success: function(msg) {
              var assetsGrid = $("#gridTableAssets")[0];
              assetsGrid.addJSONData(JSON.parse(msg));
              ...
           }
       });
    },
    ...
    pager: $('#pagerAssets'),
    rowNum: 15,
    rowList: [15, 50, 100, 'ALL'],
    ...                    
    onPaging: function(index, colindex, sortorder) {
       SessionKeepAlive();
    }
});

А вотвеб-сервис

[WebMethod]
public string GetAssetsOfAssetStructure(bool _search, int rows, int page, 
    string sidx, string sord, string filters)

1 Ответ

4 голосов
/ 17 июня 2010

Прежде всего, я нахожу ваш вопрос очень хорошим.Когда я начал с jqGrid, я искал «Все» в rowList и провел несколько экспериментов, но безуспешно.Тогда я забыл об этой проблеме.Теперь после вашего вопроса я думаю об использовании этой функции во всех моих jqGrids.

Теперь о решении.Это очень просто, но прежде всего я предлагаю заменить datatype как функцию на datatype: 'json'.Все, что вы делаете внутри функции, вы можете делать со стандартным типом 'json'.Чтобы изменить contentType на "application/json; charset=utf-8", можно использовать опцию ajaxGridOptions (подробнее см. Установка типа содержимого запросов, выполняемых jQuery jqGrid ).Можно использовать параметр postData в качестве замены data параметра jQuery.ajax, но он понадобится вам, только если вы хотите отправить некоторые дополнительные параметры на сервер (как описано в Как фильтровать данные jqGrid НЕиспользуя встроенное поле поиска / фильтра ).В конце мы получаем что-то вроде следующего:

$("#gridTableAssets").jqGrid({
    datatype: 'json',
    gridview: true,
    url: '/Service/Repository.asmx/GetAssets',
    //postData: postdata, // add some additional parameters
    ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
    mtype: 'POST',
    // ...
    pager: $('#pagerAssets'),
    rowNum: 15,
    rowList: [15, 50, 100, 'ALL'],
    serializeGridData: function (postData) {
        if (typeof postData.rows === "string") {  // "ALL"
            postData.rows = 10000;  // or -1 if your server 
        }
        if (isNaN(postData.page)) { // fix NaN in page for rows="ALL"
            postData.page = 1;
        }
        return JSON.stringify(postData);
    },
    // ...                    
});

Если вы планируете использовать serializeGridData, ajaxGridOptions и некоторые другие параметры во всех ваших jqGrids, вы можете определить эту функцию внутри $.jgrid.defaults (см.еще раз Установка типа содержимого запросов, выполняемых jQuery jqGrid ).

...