paginacion net mvc framework bootstrap asp c# linq asp.net-mvc-4 pagination pagedlist

c# - net - PagedList usando LINQ Skip and Take, pero muestra la paginación usando Count of results



pagination razor mvc (5)

Estoy tratando de mostrar una lista filtrada de productos, basada en el filtro de Categoría y en ItemsPerPage, pero tengo algunos problemas al intentar usarla con PagedList.

Alguien con experiencia en PagedList podría aconsejarme si necesito escribir mi propio código de paginación o si hay una manera de obtener los resultados que necesito usando PagedList.

Estoy usando las funciones Saltar y Tomar de LINQ para obtener solo el número de filas que se deben mostrar en la página actual, pero aún así me gustaría que los enlaces de paginación muestren páginas según el recuento total del filtro.

Por ejemplo: mi filtro de búsqueda encuentra 50 resultados, pero como mis filas por página son, por ejemplo, 10 elementos, uso Skip () y Take () de LINQ para recuperar solo 10 filas. Todavía necesito mostrar en mi View.cshtml los enlaces de página << 1 | 2 | 3 | 4 | 5 >> Ahora mismo, con PagedList predeterminado, solo obtengo << 1 >> , sé por qué solo veo una página, pero solo quería saber cómo puedo hacer que funcione para mostrar el número correcto de enlaces de página, mientras que solo obtengo un subconjunto. de resultados.

** Mi objetivo es escribir consultas optimizadas en la base de datos para que el rendimiento de respuesta de la página web sea rápido.

Así es como se ve mi código para el Método de Acción. El código está obteniendo los resultados correctos, pero la paginación no funciona, ya que necesito que sea:

public ViewResult List(int page =1, string category =null) { if (category != null) this.CurrentCategory = category; var products = repository.Products .Where(p => this.CurrentCategory == null || p.Category == this.CurrentCategory) .OrderBy(p => p.ProductID) .Skip((page -1) * PageSize) .Take(PageSize); return View(products.ToList().ToPagedList(page, PageSize)); }

Aquí está el fragmento de código de la Vista que trata sobre la paginación. Busqué en el sitio de Github del proyecto, pero no pude encontrar un método de extensión para proporcionar páginas personalizadas. Creo que solo representará el número de páginas basadas en ''elementos por página'' y el recuento () de productos en @Model:

@model IPagedList<Product> //foreach loop that renders the @Model //Code that displays the pagination using PagedList <div style="text-align:center"> @Html.PagedListPager(Model, page => Url.Action("List", new { page = page, category = ViewBag.CurrentCategory }), PagedListRenderOptions.OnlyShowFivePagesAtATime ) </div>


Es probable que aún tenga que solicitar un recuento por separado.

var products = repository.Products .Where(p => this.CurrentCategory == null || p.Category == this.CurrentCategory); var numProds = products.Count(); var mypage = products.OrderBy(p => p.ProductID) .Skip((page -1) * PageSize) .Take(PageSize);


La explicación anterior es correcta. Pero cuando estás asignando lista de selección estática ...

new StaticPagedList<Product>(products, page, PageSize, count);.

Muestra menos número de enlace de página desde el recuento real. Si Count es 10, muestra solo 2 páginas si el tamaño de tu página es 5 ..

Si desea mostrar todos los enlaces de páginas disponibles en la cuenta, entonces

pass count*5 ie count*pagesize new StaticPagedList<Product>(products, page, PageSize, count*5);//in my case page size is 5

o la nueva StaticPagedList (productos, página, Tamaño de página, contar * tamaño de página);

Por lo tanto, proporciona todos los conteos disponibles en las páginas.


Si usa los métodos de PagedList, no necesita usar también LINQ .skip() y .take() . Si lo hace, entonces está limitando previamente la lista, y sería inútil usar la biblioteca porque primero está filtrando la lista para obtener resultados de .skip() de .skip() de .skip() y .take() luego pasar esos resultados de pagesize a se filtrará nuevamente a pagesize de pagesize , que por supuesto será el mismo, pero luego PagedList no sabe cuál es el total.

Si desea asegurarse de que no está cargando todos los resultados, simplemente envíe un IQueryable a PagedList en lugar de un Enumerable o una List . PagedList agregará .Skip() y .Take() por usted, y su base de datos solo devolverá esos resultados.


Tuve exactamente el mismo problema y terminé usando StaticPagedList. Puedes hacer algo como esto

public ViewResult List(int page =1, string category =null) { if (category != null) this.CurrentCategory = category; var products = repository.Products .Where(p => this.CurrentCategory == null || p.Category == this.CurrentCategory) .OrderBy(p => p.ProductID) .Skip((page -1) * PageSize) .Take(PageSize); var count = repository.Products .Where(p => this.CurrentCategory == null || p.Category == this.CurrentCategory).Count(); var resultAsPagedList = new StaticPagedList<Product>(products, page, PageSize, count); return View(resultAsPagedList); }

En cuanto a la vista, solo necesitas reemplazar el tipo de modelo.

@model StaticPagedList<Product>


ToPagedList usa Take and Skip internamente y cuando usa la extensión a la clase IQueryable<T> , esto resultará en la consulta de la base de datos que necesita. También recupera el TotalItemCount en sus metadatos.

A veces es posible que tenga que llevar los resultados de la consulta a la memoria porque está usando un método que no se puede traducir a sql. Eso significa que tienes que convertir el PagedList nuevo a un Enumerable . Puede solucionar este problema utilizando el método StaticPagedList la StaticPagedList manera:

var superset= repository.Products .Where(p => this.CurrentCategory == null || p.Category == this.CurrentCategory) .OrderBy(p => p.ProductID) .ToPagedList(page, PageSize); var subset = superset .AsEnumerable() .Select(p => new ProductViewModel { OtherData = p.UntranslateableMethod() }) var model = new StaticPagedList<ProductViewModel>(subset, superset.GetMetaData()); }

Del resumen del método en comentarios:

Inicializa una nueva instancia de la clase PagedList.StaticPagedList que contiene el subconjunto ya dividido e información sobre el tamaño del superconjunto y la posición del subconjunto dentro de él.