jqGrid: POST-данные на сервер для извлечения данных строки (фильтрация и поиск) - PullRequest
20 голосов
/ 31 октября 2010

У меня есть такая форма:

<form id='myForm'>
<input type='text' name='search' />
<input type='text' name='maxPrice' />
</form>

и таблица для моего jqGrid:

<table id='myGrid'></table>

Мне нужно POST (а не GET) данные из myForm в мой метод сервера, чтобы получить данные строки и заполнить сетку. До сих пор я не смог получить jqGrid для POST ничего. Я дважды проверил сериализацию данных, и она корректно сериализует данные моей формы. Вот мой код jqGrid:

$("#myGrid").jqGrid({
    url: '/Products/Search") %>',
    postData: $("#myForm").serialize(),
    datatype: "json",
    mtype: 'POST',
    colNames: ['Product Name', 'Price', 'Weight'],
    colModel: [
        { name: 'ProductName', index: 'ProductName', width: 100, align: 'left' },
        { name: 'Price', index: 'Price', width: 50, align: 'left' },
        { name: 'Weight', index: 'Weight', width: 50, align: 'left' }
    ],
    rowNum: 20,
    rowList: [10, 20, 30],
    imgpath: gridimgpath,
    height: 'auto',
    width: '700',
    //pager: $('#pager'),
    sortname: 'ProductName',
    viewrecords: true,
    sortorder: "desc",
    caption: "Products",
    ajaxGridOptions: { contentType: "application/json" },
    headertitles: true,
    sortable: true,
    jsonReader: {
        repeatitems: false,
        root: function(obj) { return obj.Items; },
        page: function(obj) { return obj.CurrentPage; },
        total: function(obj) { return obj.TotalPages; },
        records: function(obj) { return obj.ItemCount; },
        id: "ProductId"
    }
});

Вы видите, что я делаю неправильно или должно быть по-другому?

1 Ответ

42 голосов
/ 31 октября 2010

Ваша основная ошибка - использование параметра postData в форме:

postData: $("#myForm").serialize()

У этого использования есть две проблемы:

  1. Значение $("#myForm").serialize() перезаписывает все параметры запросов POST вместо добавления дополнительных параметров.
  2. Значение $("#myForm").serialize() будет вычислено только один раз в течение времени инициализации сетки. Таким образом, вы всегда будете отправлять search="" и maxPrice="" на сервер.

Я предлагаю вам заменить форму именованными полями редактирования на

<fieldset>
<input type='text' id='search' />
<input type='text' id='maxPrice' />
<button type='button' id='startSearch'>Search</button>
</fieldset>

определить параметр postData как объект с методами:

postData: {
    search: function() { return $("#search").val(); },
    maxPrice: function() { return $("#maxPrice").val(); },
},

и добавьте обработчик событий onclick к кнопке «Поиск» (см. Фрагмент HTML выше)

$("#startSearch").click(function() {
    $("#myGrid").trigger("reloadGrid");
});

Более того, вы ничего не пишете о серверной технологии, которую используете. Может потребоваться дополнительная модификация, чтобы иметь возможность считывать параметры на стороне сервера (например, serializeRowData: function (data) {return JSON.stringify(data);}, см. , и , ). Я также рекомендую прочитать еще один старый ответ: Как фильтровать данные jqGrid, НЕ используя встроенное поле поиска / фильтра .

Некоторые другие небольшие ошибки, такие как '/Products/Search") %>' вместо '/ Products / Search' или использование устаревшего параметра imgpath (см. документация ), менее важны. Параметры столбца по умолчанию, такие как align: 'left', лучше удалить.

Рассмотрим также использование поиска в сетке. Например расширенный поиск

$("#myGrid").jqGrid('navGrid','#pager',
                    {add:false,edit:false,del:false,search:true,refresh:true},
                    {},{},{},{multipleSearch:true});

, а также панель инструментов поиска :

$("#myGrid").jqGrid('filterToolbar',
                    {stringResult:true,searchOnEnter:true,defaultSearch:"cn"});

вероятно, он может заменить форму поиска, которую вы используете.

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