searchString, searchField и searchOper возвращаются пустыми из jqGrid в приложении ASP.NET

Я создаю приложение asp.net mvc и загружаю данные в jqgrid, и у меня полностью работает пейджинг и сортировка. Я пытаюсь реализовать поиск и реализовал код для отображения окна поиска; но когда я нажимаю кнопку «Найти», я не могу получить searchString, searchField и searchOper, поскольку они возвращаются как пустые. Я уверен, что мне нужно реализовать код постданных в javascript, но у меня возникли проблемы с его реализацией. Может кто-то указать мне верное направление?

Кроме того, есть идеи о том, как реализовать поиск в действии контроллера??

Это то, что у меня сейчас есть в javascript:

 <script type="text/javascript">
    $(function () {
          $("#list").jqGrid({
              url: '/Home/GetData/',
                    datatype: 'json',
                    mtype: 'GET',
                    colNames: ['ID', 'NAME'],
                    colModel: [
      { name: 'ID', index: 'ID', width: 250, align: 'center', searchoptions: { sopt: ['eq', 'ne', 'cn']} },
      { name: 'NAME', index: 'NAME', width: 250, align: 'center',  searchoptions: { sopt: ['eq', 'ne', 'cn']} }],
                    pager: jQuery('#pager'),
                    rowNum: 10,
                    rowList: [5, 10, 20, 30, 40, 50],
                    sortname: 'ID',
                    sortorder: "desc",
                    viewrecords: true,
                    height: '100%'
                    });

                $("#list").jqGrid('navGrid', '#pager', { edit: true, add: true, del: true, search: true},
                                                        {},
                                                        {},
                                                        {},
                                                        {closeOnEscape: true, multipleSearch: true, closeAfterSearch: true},
                                                        {});


            }); 
</script>

Любая помощь приветствуется!


person inspiringmyself    schedule 28.06.2012    source источник


Ответы (1)


Вы используете multipleSearch: true вариант поиска. Он позволяет создавать более мощные запросы, но использует другой формат параметров. Вместо трех параметров searchString, searchField и searchOper будет использоваться один параметр filters, который представляет в виде строки JSON полную информацию о фильтре. Дополнительную информацию см. в документации.

Например, в ответе вы найдете код, демонстрирующий, как можно проанализировать параметр filters и создать соответствующую фильтрацию данные в случае использования Entity Framework для доступа к базе данных.

person Oleg    schedule 28.06.2012
comment
Большое спасибо за Вашу помощь. Я следую вашей ссылке, чтобы реализовать действие контроллера. При вызове FilterObjectSet(DBcontext) я передаю контекст БД, и это не сработало, поэтому я попытался преобразовать его в ObjectSet и передать как ObjectSet. Это то, что я сделал. ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; ObjectSet‹RequestResponse› objectSet = objectContext.CreateObjectSet‹RequestResponse›(); Но до сих пор не могу заставить его работать. У вас есть обходной путь для этой проблемы? - person inspiringmyself; 28.06.2012
comment
@ user1484365: Параметр FilterObjectSet должен быть каким-то классом из DBcontext, например context.Questions, а не DBcontext. Вы уверены, что используете Entity Framework, а не LINQ to SQL? Полную рабочую демонстрацию можно загрузить с здесь или здесь. Я думаю, что имея работающий демонстрационный проект, вы сможете доработать его под свои требования. - person Oleg; 28.06.2012
comment
Да, при вызове FilterObjectSet(db.Response) я передаю класс в контексте, но проблема в том, что класс DbContext в структуре Entity создает DBQuery вместо Object Query. Итак, когда я передаю FilterObjectSet(db.Response), он жалуется, что не может преобразовать из DbSet в ObjectQuery, потому что Response является DbSet в классе DbContext. Итак, я пытаюсь найти способ преобразовать DbQuery в ObjectQuery, чтобы я мог правильно вызвать метод. И да, я использую Entity Framework. - person inspiringmyself; 28.06.2012
comment
@ user1484365: Вы не можете использовать LINQ to Entities в качестве входных данных для FilterObjectSet. Вы должны использовать исходный ObjectSet<Response> так, как он должен быть определен в DbContext, производном от ObjectContext. - person Oleg; 28.06.2012
comment
На самом деле в Code First классы контекста наследуются от класса DbContext в System.Data.Entity, и я не могу наследовать от ObjectContext. Означает ли это, что я вообще не могу использовать вашу реализацию? - person inspiringmyself; 28.06.2012
comment
@ user1484365: Можно ли использовать что-то вроде DBcontext.CreateObjectSet<Response>("Response"), чтобы получить ObjectSet<Response>? - person Oleg; 28.06.2012
comment
@user1484365: Если у вас ничего не получится, вам, возможно, придется использовать Dynamic Linq Framework см. здесь. - person Oleg; 28.06.2012
comment
Да, я пробовал это. ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; (где db — это контекст).ObjectSet‹RequestResponse› objectSet = objectContext.CreateObjectSet‹RequestResponse›(RequestResponse). Затем попытался вызвать FilterObjectSet(objectSet), и он жалуется на отсутствие неявного преобразования между System.Data.Entity.DbSet в System.Data.Objects.ObjectQuery. Я смущен тем, как он предполагает objectSet как DbSet даже после преобразования в objectContext, а затем в ObjectSet. - person inspiringmyself; 28.06.2012
comment
@ user1484365: Я не уверен, в чем проблема с вашей моделью EF. Я могу использовать ObjectSet<Question> questions = context.CreateObjectSet<Question>("Questions");, а затем использовать ObjectQuery<Question> filteredQuery = f.FilterObjectSet(questions);. Я не уверен, почему вы не можете сделать то же самое. Возможно, вам следует использовать "RequestResponses" вместо "RequestResponse"? Как называется таблица в базе данных? - person Oleg; 29.06.2012
comment
Я понял, в чем дело. При вызове этого оператора ObjectQuery‹RequestResponse› filteredQuery = (f == null ? objectSet : f.FilterObjectSet(objectSet)); objectSet должен быть размещен в обоих местах; но я сделал следующее: ObjectQuery‹RequestResponse› filteredQuery = (f == null ? db.RequestResponses: f.FilterObjectSet(objectSet)); и не понял, что ошибка возникла из-за db.RequestResponses, так как я просто сосредоточился на методе FilterObjectSet. Очень хочу оценить ваше время и отзывчивость Олег, вы молодец! - person inspiringmyself; 29.06.2012
comment
Извините, Олег, мне не разрешили проголосовать, так как для этого нужно пятнадцать репутаций, а я действительно новичок в переполнении стека! В любом случае, спасибо еще раз. - person inspiringmyself; 29.06.2012
comment
@ user1484365: Проголосовать не проблема. Вы получите право после 15 очков репутации. У меня достаточно очков репутации, которые я никогда не использую. :-) Самое главное, что теперь у вас есть работающее решение, и я рад, что смог вам помочь. С наилучшими пожеланиями! - person Oleg; 29.06.2012
comment
Спасибо. Но я думаю, что у меня будет больше вопросов к вам в будущем, так как я реализую больше функциональности, так что следите за постом и продолжайте в том же духе :) - person inspiringmyself; 29.06.2012