Мне кажется, что лучше всего отделить некоторые действия, которые предоставляют чистые данные для jqGrid, от других действий контроллера.Такие jqGrid-ориентированные действия могут иметь такой прототип, как:
JsonResult GetData(string filter, string sidx, string sord, int page, int rows)
Я лично предпочитаю реализовать эту часть как службу WCF и использовать эту службу WCF как часть того же сайта ASP.NET.В общем, это намного больше вопрос вкуса и зависит от других требований вашего проекта.
Эта часть вашего сайта ASP.NET может реализовывать аутентификацию пользователей, которая вам нужна, и может быть протестирована с помощью модульных тестов точно так же, как другие действияваши контроллеры.
Представления сайта ASP.NET MVC могут содержать пустых данных для jqGrids, иметь только правильные URL-адреса и, возможно, генерировать HTML-код, в зависимости от разрешения пользователей на сайте.,Каждая страница будет заполнять данные jqGrids соответствующими запросами к серверу (запрос к соответствующему действию GetData
).
Вы можете использовать HTTP GET для данных длялучшее кэширование данных.Кеширование данных является предметом отдельного обсуждения.Если вы сделаете это, вы должны использовать prmNames: { nd:null }
в определении jqGrid, чтобы удалить уникальный параметр nd
с отметкой времени, добавляемой по умолчанию к каждому запросу GET.Чтобы получить полный контроль над кэшированием данных на стороне сервера, вы можете, например, добавить в заголовки HTTP ответов сервера оба параметра: "Cache-Control"
, установленный в "max-age=0"
, и заголовок "ETag"
со значением, рассчитанным на основе данных, возвращаемых в ответе.,Вы должны проверить, имеет ли запрос от клиента "If-None-Match"
заголовок HTTP со значением "ETag"
coresponds данные, кэшированные на клиенте.Затем вы должны проверить, изменены ли текущие данные на сервере (в базе данных), и, если они не были изменены, сгенерировать ответ с телом empty
(для SuppressEntityBody
установлено значение true) и вернуть «304 Не изменено»код состояния (HttpStatusCode.NotModified
) вместо значения по умолчанию «200 OK».Более подробное объяснение гораздо длиннее.
Если вы не хотите оптимизировать свой сайт для кэширования данных HTTP GET для jqGrids, вы можете либо использовать HTTP POST, либо не использовать параметр prmNames: { nd:null }
.
Код внутри JsonResult GetData(string filter, string sidx, string sord, int page, int rows)
не слишком важен.Вы должны десериализовать данные JSON из строки filter
и затем построить запрос к модели данных в зависимости от метода доступа к данным, который вы используете (LINQ to SQL, Entity Model или SqlCommand
с SqlDataReader
).Поскольку эта часть уже реализована, обсуждать ее нет смысла.
Вероятно, основная часть моего предложения - это использование четкого разделения действий контроллера, которые предоставляют данные для всех ваших jqGrids, и использованиеMVC просматривает с пустыми данными (имеющими только <table id="list"></table><div id="pager"></div>
).Вы также не должны сомневаться в наличии относительного длинного кода для анализа фильтров, которые исходят из функции расширенного поиска jqGrid, и для генерации или соответствующих запросов к вашей модели данных.Просто осуществите это один раз.В моей реализации код также относительно сложен, но он уже написан один раз, он работает, и его можно использовать для всех новых jqGrids.