jqGrid не рассчитывает страницы при первой загрузке - PullRequest
0 голосов
/ 30 января 2012

Я использую jqGrid в веб-приложении ASP.NET MVC.При первой загрузке страницы кнопки пейджера отключаются и всегда показывают страницу 1 из 1. Однако если я изменю размер страницы, отсортирую столбец или выполню поиск, страницы обновятся соответствующим образом.

У меня естьпопытался вызвать reloadGrid в gridComplete и loadComplete, но ни один из них не сработал.Что вызывается, когда я выполняю другие действия, которые заставляют страницу обновляться?

Вот моя сетка:

$(document).ready(function () {
    $('#grid').jqGrid({
        url: '@Url.Action("GetGridData", "MyController")',
        datatype: 'json',
        loadonce: true,
        mtype: 'POST',
        postData: {},
        colNames: ['Name', 'Price', 'Inventory'],
        colModel: [
            { name: 'Name', index: 'Name' },
            { name: 'Price', index: 'Price', sorttype: 'float', formatter: 'number', align: 'right' },
            { name: 'Inv', index: 'Inv', sorttype: 'int', align: 'right' }
        ],
        pager: '#gridpager',
        rowNum: 10,
        rowList: [5, 10, 20, 50, 100],
        sortname: 'Name',
        sortorder: 'asc',
        viewrecords: true,
        caption: 'Inventory',
        hidegrid: false,
        forceFit: true,
        height: 'auto',
        width: 1200
        //loadComplete: function() {     
        //    $('#grid').trigger("reloadGrid");
        //},
        //gridComplete: function () {
        //    $('#grid').trigger("reloadGrid");
        //}
    }).jqGrid('filterToolbar', { searchOnEnter: false }).jqGrid('navGrid', '#gridpager', { del: false, add: false, edit: false, search: false });

Код сервера:

[HttpPost]
public JsonResult GetGridData(string sidx, string sord, int page, int rows)
{
    List<Inventory> data = InventoryModel.GetInventory();

    var count = data.Count;

    var jsonData = new
        {
            total = (int)Math.Ceiling((double)count / rows),
            page = 1,
            records = count,
            rows = (from row in data
                    select new
                    {
                        id = row.Name,
                        cell = new object[]
                            {
                                row.Name,
                                row.Price,
                                row.Inv                         
                            }
                    }).ToArray()
        };
    return Json(jsonData);
}

JSONданные:

{
  "total":11,
  "page":1,
  "records":104,
  "rows": [ { "id":"PRODUCT-1", "cell":["PRODUCT-1",0.52,41] },
            { "id":"PRODUCT-2", "cell":["PRODUCT-2",0.43,50] },
          ... ]
}

1 Ответ

1 голос
/ 30 января 2012

Я почти уверен, что причина в неправильных данных JSON, которые возвращают сервер. Я полагаю, что сервер возвращает total, равный 1, независимо от rowNum, который будет отправлен на сервер в качестве параметра rows. Важно понимать, что тело сетки будет иметь первые rowNum (10) строк в том же порядке, что и в ответе сервера. Поскольку вы используете loadonce: true, то следующее обновление сетки работает локально , и поэтому оно работает правильно. В любом случае сервер должен заполнить правильный параметр total, и он должен использовать, если отсортированные данные соответствуют опциям sortname и sortorder jqGrid. Параметры будут отправлены на сервер как sidx и sord.

ОБНОВЛЕНО : причина ошибки в jqGrid 4.3.1

линия

ts.p.lastpage = Math.min( ts.p.page, Math.ceil(len/ rn) );

должно быть зафиксировано на

ts.p.lastpage = Math.ceil(len/ rn);

Для получения дополнительной информации см. Мой отчет об ошибках здесь и исправление в версии jqGrid на github здесь

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