2014-09-07 1 views
0

Я пытаюсь реализовать расширенный поиск с использованием JQGrid и MVC4. Определение моей модели, кажется, хорошо (как показано ниже):Фильтры поиска jqGrid не загружаются в MVC 4

public class SearchModel 
{ 
    public string sidx { get; set; } 
    public string sord { get; set; } 
    public int page { get; set; } 
    public int rows { get; set; } 
    public bool _search { get; set; } 
    public string searchField { get; set; } 
    public string searchOper { get; set; } 
    public string searchString { get; set; } 
    public FilterModel filters { get; set; } 
} 
public class FilterModel 
{ 
    public string groupOp { get; set; } 
    public List<RuleModel> rules { get; set; } 
} 
public class RuleModel 
{ 
    public string field { get; set; } 
    public string op { get; set; } 
    public string data { get; set; } 
} 

Однако, когда я бегу и поиск UserName и FirstName, принимающий контроллер показывает фильтры, как нуль. Тогда я проверил (Request.Params) [ "фильтры"], он показывает следующий текст -

"{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"UserName\",\"op\":\"eq\",\"data\":\"a\"},{\"field\":\"FirstName\",\"op\":\"eq\",\"data\":\"b\"}]}" 

и это показывает _search верно. Я что-то пропустил?

+0

Не могли бы вы разместить полный запрос json, который вы получаете? –

+0

Извините, но как получить JSON? Я использую параметр URL JQGrid для указания действия и ничего другого. –

+0

Вы попробовали мой ответ? –

ответ

0

Если я помню исправить запрос содержит анонимный объект JSON (без имени), так что в вашем контроллере вы не можете передать один SearchModel аргумент, вы должны добавить все аргументы в явном виде:

ActionName (string sidx, string sord, int page, ..., FilterModel filters) 

Альтернативой может быть создание настраиваемого связующего устройства (что довольно просто), которое обернет ваши параметры запроса в один объект SearchModel.

+0

Действительно, он работает для всех других вариантов. Простой поиск работает нормально. Но просто расширенный поиск, вызывающий проблему. –

+0

Опубликовать строку запроса, которую вы получаете в запросе (Request.QueryString) –

+0

Я думаю, что что-то связано с HTML Encode ... Я получаю QueryString как: _search = true & nd = 1410081961485 & rows = 10 & page = 1 & sidx = & sord = asc & filters = % 7b% 22groupOp% 22% 3A% 22 И% 22% 2c% 22rules% 22% 3a% 5b% 7b% 22field% 22% 3a% 22IsActive% 22% 2c% 22op% 22% 3a% 22eq% 22% 2c% 22data % 22% 3a% 22true% 22% 7d% 5d% 7d –

0

Я думаю, что основная проблема, которая у вас есть, заключается в том, что параметр filters будет отправлен jqGrid в другим способом как и все остальные параметры. Вы можете определить его как string и сделать преобразование в FilterModel от JSON вручную (используя JsonConvert.DeserializeObject<FilterModel>(filters) от Newtonsoft.Json или используя serializer.Deserialize<FilterModel>(filters), где JavaScriptSerializer serializer = new JavaScriptSerializer();). Мне кажется самым простым способом. Вы можете использовать специализированное связующее устройство MVC, но в итоге вы получите те же результаты.

В качестве альтернативы вы можете попробовать изменить значение параметра filters, посылающие jqGrid

serializeGridData: function (postData) { 
    var dataToSend = $.extend({}, postData); // make copy 
    if (dataToSend.filters) { 
     dataToSend.filters = $.parseJSON(postData.filters); 
    } 
    // the last statement can be not needed and one should just use 
    //  return dataToSend; 
    // instead. If one do convert the data to JSON as in the line below 
    // one should use ajaxGridOptions: { contentType: "application/json" } 
    // option of jqGrid to set the corresponding ContentType HTTP header 
    return JSON.stringify(dataToSend); 
} 

Я не тестировал код выше, но я думаю, что она могла бы работать.

Кроме того, я хочу опубликовать некоторые общие замечания.

Вам необходимо реализовать обработку и фильтрацию на стороне сервера только для действительно больших данных. В случае наличия менее 1000 строк данных, например, я предпочитаю использовать параметр loadone: true и возвращать все данные по одному клиенту. Фильтрация такого набора данных на стороне клиента работает очень хорошо (и даже быстрее, поскольку фильтрация на стороне сервера), и вам не нужно писать код сервера для фильтрации. Итак: не пытайтесь использовать фильтрацию на стороне сбоку на небольшом наборе данных.

Следующее примечание. Если вы используете только расширенный поиск, вы можете удалить параметры searchField, searchOper и searchString. «Простой» поиск - это устаревшая модель.

Следующее замечание: по умолчанию имена параметров, которые отправляют jqGrid, не самые лучшие: sidx, sord, _search. Можно использовать параметр prmNames jqGrid для переименовать почти все параметры отправлены jqGrid. Например, если вы используете prmNames: {sort: "sortIndex", order: "sortDirection", search: "isSearching"}, вы можете переименовать sidx в sortIndex, sord в sortDirection и _search в isSearching в SearchModel.

Последнее замечание. Если вам действительно нужно реализовать фильтрацию данных на стороне сервера, вы можете рассмотреть возможность реализации модели , описанной here. Он включает в себя groups часть вместе с rules. Часть groups будет заполнена, если вы воспользуетесь опцией multipleGroup: true вместе с multipleSearch: true.