2011-08-25 4 views
4

Мне нужно реализовать разбиение на страницы, количество элементов на страницу и сортировку для моего приложения MVC3. На моей странице просмотра У меня есть список предметов, которые поступают из модели. Я буду отображать несколько элементов (определяемых пользователем) каждый внутри div, за каждую страницу. Я не строю стол.MVC3 Pagination, items per page

Я знаю, что mvccontrib может построить таблицу с пейджингом, и не уверен, что эта разбивка на страницы может быть написана вообще, потому что мне нужно создать мою. Какой хороший подход к решению этого?

+0

Вы хотите разместить данные на стороне клиента или сервера? –

+1

jqGrid OR Knockout.js для победы ... –

+0

@ShaneC: Я упомянул ExtJs, так как мы говорим о тяжеловесах. :) – codenheim

ответ

0

Если вы ищете в первую очередь на стороне клиента решение, я никогда не имел никаких проблем с TableSorter JQuery с Paginator плагин: http://tablesorter.com/docs/example-pager.html

Если вы хотите сделать это на стороне сервера, то общий подход заключается в том, что вам собираются кэшировать всю серверную сторону набора результатов *, а затем совершать (ajax или иначе) вызовы на сервер, указывая, какие записи необходимы. Вы передадите начальный индекс и количество записей, которые будут возвращены через querystring или поле формы (а также некоторый идентификатор запроса, чтобы убедиться, что вы получаете правильный набор результатов).

* Как отмечает mrjoltcola в комментариях, кешировать или не кэшировать - это случайная проблема, для больших наборов результатов может возникнуть больше смысла делать больше вызовов db с меньшими наборами результатов. Альтернативное решение проблемы с большим количеством результатов ограничивает их размер результирующего набора и отображает сообщение, предлагающее им сделать свой запрос более конкретным, если превышено пороговое значение. Я бы посоветовал сначала с вашего наилучшего суждения и оптимизации при необходимости.

+0

Все хорошо, за исключением кеширования. Обычно мы просто передаем диапазон страниц в db, несколько раз, поэтому запрос использует его в своем предельном предложении (LIMIT, ROWNUM). Некоторые результирующие наборы слишком велики для кэширования, и даже с небольшими наборами результатов кеширование может быть проблемой с большой пользовательской базой. Но все же хороший момент, поскольку есть некоторые приложения, которые на самом деле требуют подкачки результирующего набора во время выполнения запроса. Кэширование становится требованием. – codenheim

+0

@mrjoltcola fair point, отредактировал мой пост – heisenberg

0

С помощью простого HTML вы можете использовать справку Webgrid в WebMatrix. Он поддерживает пейджинг из коробки с MVC.

http://msdn.microsoft.com/en-gb/magazine/hh288075.aspx

В противном случае, ни один из основных компонентов JavaScript (jqgrid, ExtJS, и т.д.) могут сделать подкачки, все в зависимости от того, что ваш источник модели. Если вы используете источник данных AJAX, вам необходимо передать свойства подкачки назад и вперед, чтобы пейджинг мог быть эффективно выполнен на стороне сервера (в зависимости от базы данных вашей базы данных).

1

Для пейджинга на стороне сервера, я использую https://github.com/dvsspr/Halaman. Он еще не задокументирован, но он очень гибкий и использует свободную конфигурацию.

Один очень простой вариант использования для вас.

@Controller

public ActionResult Index(AdminPageInfo page, SortInfo sort) 
{ 
    PagedData<Account> model = accountRepository.Get().AsPagedData(page, sort); 
    return (model.IsValid) ? View(model) : View("_Error"); 
} 

@View

@model PagedData<Account> 
@{ 
    ViewBag.Title = "Account Index"; 
} 
<p> 
    Total records: <strong>@Model.TotalRows</strong> 
    <br /> 
    Total pages: <strong>@Model.TotalPages</strong> 
    <br /> 
    Total records in current page: <strong>@Model.TotalRowsInPage</strong> 
</p> 
@Html.Pager(Model) 
@Html.Sizer(Model) @* Page size changer helper =) *@ 
@* 
Put a dot after the closing brace and you will see the available options. 
*@ 

<h3>Sorter</h3> 
<li> 
    <ul>@(Html.SortLink<Account>(zz => zz.Id, Model, "User Id"))</ul> 
    <ul>@(Html.SortLink<Account>(zz => zz.UserName, Model, "User Name"))</ul> 
    <ul>@(Html.SortLink<Account>(zz => zz.FullName, Model, "Full Name"))</ul> 
</li> 
@foreach (var acc in Model) { 
    <p> 
     User name: @acc.UserName 
     <br /> 
     Full name: @acc.FullName 
    </p> 
} 

Вот так. IMHO, кодовая база может быть взломана легко - на всякий случай, если вы хотите реализовать гибридный пейджинг.

Смежные вопросы