jqGrid - пейджер на стороне сервера - PullRequest
1 голос
/ 13 декабря 2011

Я застрял в этой проблеме и буду признателен за любую помощь ... (Олег, ты здесь ????)

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

Может ли кто-нибудь помочь мне, пожалуйста, и посмотреть, что я не так в моем коде ???

Мой код - пара:

$(myGrid).jqGrid({
    datatype: function (pdata) {
        Invoke("GetAll", pdata);
    },
    colNames: columnNames,
    colModel: columnModel,
    jsonReader: {
        root: "Result",
        page: "page",
        total: "total",
        records: "records"
    },
    rowNum: 10,
    //rowList: [5, 10, 20, 30],
    pager: '#ViewNQueryPager',
    viewrecords: true,
    shrinkToFit: true,
    loadtext: "Loading....",
    emptyrecords: "No records to view",
    viewrecords: true,
    //scrollOffset: 0,
    height: '300',
    //width: '100%',
    ignoreCase: true,
    sortname: 'ID',
    sortable: true,
    sortorder: 'asc',
    grouping: true,
    groupingView: {
        groupField: ['ID']
    }
});
$(myGrid).jqGrid('navGrid', '#ViewNQueryPager', { del: false, add: false, edit: false }, {}, {}, {}, { multipleSearch: true, multipleGroup: true, showQuery: true, onSearch: function (response) { showQueryDetails(); } });
$(myGrid).jqGrid('filterToolbar', { stringResult: true, searchOnEnter: true });
$(myGrid).fluidGrid({ base: '#tableBox', offset: -20 });

function Invoke(action, pdata) {

    var request = new Object();
    if (pdata.filters == undefined && pdata._search == false)
        request.Action = "Sort";
    else {
        if (pdata.filters != undefined && pdata._search == false)
            request.Action = action;
        else request.Action = "Filter";
    }
    if (pdata) {
        request.SortIndex = pdata.sidx;
        request.SortOrder = pdata.sord;
        request.PageNumber = pdata.page;
        request.PageSize = pdata.rows;
        request._search = pdata._search;
        request.filters = pdata.filters;
    }

    var cRequest = new Object();
    cRequest.request = request;

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: 'WebService.asmx/Get',
        ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
        dataType: "json",
        data: JSON.stringify(cRequest),
        success: function (xhrResponse, textStatus) {
            var data = xhrResponse.d;
            var table = $('#ViewNQueryTable');
            table.clearGridData();
            //table.total = data.total;

            for (var i = 0; i < data.Result.length; i++) {
                table.addRowData(i + 1, data.Result[i], 'last');
            }
            $('#totalRecordsFound').html(data.records + " Customers");
            pdata.filters = undefined;
            pdata._search = false;
        },
        error: function (data, textStatus) {
            alert("Error fetching data");
        }
    });
}

Я пытался добавить это:

onPaging: function (which_button) {
        doSomething()
    } 

Но это не помогло.

Как получить кнопки пейджинга для вызова метода сервера?

EDIT

Мой веб-метод такой:

[WebMethod]
public kResponse Get(kRequest request)
{
    if (count == 0)
    {
        CurrentList = JsonHelper.GetPersons();
        count++;
    }

    var response = new kResponse();

    switch (request.Action)
    {
        case "GetAll":
            var result = new List<Person>();
            var list = JsonHelper.GetPersons();
            CurrentList = list;
            response.records = CurrentList.Count;
            response.total = response.records / request.PageSize;
            //response.total = list.Count;
            response.page = request.PageNumber;
            for (int i = 0; i < 10; i++)
            {
                result.Add(list[i]);    
            }

            //response.Result = result;
            response.Result = list;

            break;
        case "Filter":
            var filterParams = Filter.Create(request.filters);
            List<Person> FilterdList = GetFilteredList(filterParams);
            CurrentList = FilterdList;
            response.Result = CurrentList;
            response.records = CurrentList.Count();
            response.total = response.records / request.PageSize;
            //response.total = list.Count;
            response.page = request.PageNumber;
            break;

        case "Sort":
            //var listPersons = JsonHelper.GetPersons();
            IQueryable<Person> SortedList = ApplySort(CurrentList.AsQueryable(), request.SortIndex, request.SortOrder);
            CurrentList = SortedList.ToList();
            response.Result = CurrentList;
            response.records = CurrentList.Count();
            response.total = response.records / request.PageSize;
            //response.total = list.Count;
            response.page = request.PageNumber;
            break;
        case "NextPage":
            List<Person> allList = JsonHelper.GetPersons();
            IQueryable<Person> NextPagelist = allList.AsQueryable();
            NextPagelist = NextPagelist.Skip(request.PageNumber * request.PageSize).Take(request.PageSize).AsQueryable();
            response.Result = NextPagelist;
            response.records = NextPagelist.Count();
            response.total = response.records / request.PageSize;
            //response.total = list.Count;
            response.page = request.PageNumber++;


            break;
    }
    return response;
}

с классом:

public class kRequest

public string Action { get; set; }
public int PageSize { get; set; }
public int PageNumber { get; set; }
public string SortIndex { get; set; }
public string SortOrder { get; set; }
public string Search { get; set; }
public bool _search { get; set; }

public string filters { get; set; }

и

public class kResponse

//public int Total { get; set; }
public object Result { get; set; }
public int page { get; set; }
public int total { get; set; }
public int records { get; set; }
//public GridRow[] rows { get; set; }

за пейджер, который я пробую:

$('#next_ViewNQueryPager').click(function () {

    grid.Action = "NextPage";
    triggerReloadGrid();

});

но я уверен, что это не так ... что ?? 1033 *

1 Ответ

2 голосов
/ 13 декабря 2011

Не вижу необходимости иметь дополнительный параметр Action.Вероятно, проблема связана с неправильным пониманием того, какие данные запрашиваются с сервера jqGrid в каждом стандартном запросе.Проблема в том, что сортировка, разбиение по страницам и фильтрация должны всегда анализироваться и применяться веб-сервером, а все "действия" могут быть объединены вместе .

Например,вы показываете данные из базы данных в сетке, имеющей два столбца: название продукта и цену за единицу каждого продукта.Позвольте нам отсортировать сетку по названию продукта в качестве начальной опции jqGrid (sortname is 'ProductName') и использовать значение по умолчанию для rowNum: 20. После начального заполнения сетки пользователь установил фильтр для получения продуктов сцена менее 100 долларов.В случае, если для параметра _search будет установлено значение true, а для filters будет задана строка, в которой фильтр закодирован в формате JSON (см. документацию ).Таким образом, веб-метод вашего веб-сервиса будет вызываться с параметрами _search = true, filters = some value, page = 1, rows = 20, sidx ='ProductName' и sord = 'asc'.Давайте составим итоговый список из 55 товаров.Таким образом, у вас будет 3 страницы результатов, и веб-сервис должен вернуть первую страницу, соответствующую входному параметру page = 1.Затем пользователь может вручную ввести 3 в качестве номера страницы и нажать Введите или пользователь может щелкнуть заголовок столбца «Цена», чтобы отсортировать товары по цене.В любом случае, веб-метод получит новый запрос с новыми значениями параметров page, rows, sidx, sord, _search и опционально с параметром filters.

Таксервер должен всегда проверять, является ли _search true.В случае, если сервер должен применить фильтр к исходному запросу SQL, который получает все продукты.Тогда результаты должны быть отсортированы в всегда , что соответствует значению параметров sidx и sord.В конце веб-сервер должен рассчитать общее количество отфильтрованных результирующих строк и вернуть его в качестве значения выходного параметра records.Таким же образом веб-сервис должен рассчитать общее количество отфильтрованных страниц и вернуть его в выходной параметр total.В конце веб-сервис должен вернуть до rows записей (одна страница) на основе значений входных параметров page и rows.

Я пытался объяснить, что вам действительно не нужночтобы определить действия «GetAll», «Sort», «Filter», «NextPage» и т. д., и веб-служба всегда должна учитывать все входные параметры .

Кстати, если выхотите переименовать и ввести параметр, который вы можете использовать prmNames (см. здесь ).В старом ответе я объяснил, как можно реализовать вызов веб-службы напрямую, используя datatype: 'json' вместо datatype в качестве функции.

...