asp.net-mvc - net - paginacion mvc 5 c#
¿Cómo usar PagedList en la página de resultados de búsqueda en MVC? (1)
Estoy usando PagedList en mi vista de índice, que funciona bien porque es solo una lista. Entonces, cuando hago clic en el botón de la página siguiente, se ejecuta contra el índice y extrae el siguiente conjunto de elementos. Mi problema es cuando trato de usar esto en mi página de resultados después de una búsqueda avanzada. Mi búsqueda funciona bien al devolver los resultados. Hay más de 50 parámetros utilizados en la consulta y algunos se incluyen o excluyen en función de lo que se comprueba / selecciona, etc. Aquí hay un ejemplo de una posible consulta:
SQLstatement = string.Format("select * from Cards where {0} and {1} and (({2}) or ({3}))
and CardID In (Select CardID from CardAbilities where {4});", final, finalexcludefrommulti,
finalsplit, finalmulti, finalability);
var CardList = db.Cards.SqlQuery(SQLstatement).ToList();
var pageNumber = page ?? 1;
int pageSize = 5;
ViewBag.OnePageOfCards = pageNumber;
return View(CardList.ToPagedList(pageNumber, pageSize));
Esto podría generar una consulta SQL como esta:
select * from Cards where maintypeid = 1 and redbluemanacost is null
and redblackmanacost is null and blueblackmanacost is null
and redmanacost is null and bluemanacost is null and blackmanacost is null
and ((whitegreenmanacost > 0 or redgreenmanacost > 0 or greenbluemanacost > 0
or greenblackmanacost > 0 or greenorlifecost > 0 or whitegreenmanacost > 0
or redwhitemanacost > 0 or whitebluemanacost > 0 or whiteblackmanacost > 0
or whiteorlifecost > 0 ) or (greenmanacost > 0 or whitemanacost > 0 ))
and CardID In (Select CardID from CardAbilities
where abilityid = 3 or abilityid = 1007);
Aquí está parte de mi vista:
@Html.PagedListPager(Model, page => Url.Action("Results", new { page }))
Cuando uso la PagedList, los resultados aún vuelven, pero cuando hago clic en la página siguiente, intento volver a ejecutar la consulta yendo a Url.Acción "Resultados" sin ningún valor ni bloqueos. ¿Puedo almacenar los resultados y tener paginación de eso? ¿Hay otra opción de búsqueda que funcione mejor? Gracias por cualquier consejo. :)
Lo hice funcionar creando una sesión que contenga la cadena para la declaración SQL. En mi controlador de búsqueda / índice, configuro la sesión como nula para que un usuario pueda comenzar una nueva búsqueda.
Última parte del controlador de búsqueda:
Session["PageList"] = SQLstatement;
var CardList = db.Cards.SqlQuery(SQLstatement).ToList();
return View(CardList.ToPagedList(pageNumber, pageSize));
Nueva sección agregada al comienzo de Search Controller:
var pageNumber = page ?? 1;
int pageSize = 5;
ViewBag.OnePageOfCards = pageNumber;
if (Session["PageList"] != null)
{
string SearchResult = Session["PageList"].ToString();
var ResultList = db.Cards.SqlQuery(SearchResult).ToList();
foreach (var item in ResultList)
{
item.SubType = db.SubTypes.Single(x => x.SubTypeID == item.SubTypeID);
item.MainType = db.MainTypes.Single(x => x.MainTypeID == item.MainTypeID);
item.CardSet = db.CardSets.Single(x => x.CardSetID == item.CardSetID);
item.Rarity = db.Rarities.Single(x => x.RarityID == item.RarityID);
}
ViewBag.OnePageOfCards = pageNumber;
return View(ResultList.ToPagedList(pageNumber, pageSize));
También pasa int? page
int? page
en los parámetros para la búsqueda.
En el controlador de índice de búsqueda agregado:
Session["PageList"] = null;