J'utilise la pagination dans mon projet. J'ai une zone de recherche et j'envoie le texte de recherche au résultat de l'action.
J'ai atteint le point d'arrêt pour rechercher ActionResult. Mes nouvelles et annonces se remplissent après certaines requêtes.
Résultat de l'action de recherche
public ActionResult Search(string searchText,int? page)
{
int pageIndex=page??1;
int dataCount=20;
dbContext=new dbContext();
SearchViewModel searchViewModel=new SearchViewModel();
var news=(from news in dbContext.News
where news.Title.Contains(searchText)
select news).ToList();
var announcement=(from announcement in dbContext.Announcement
where announcement.Title.Contains(searchText)
select announcement).ToList();
searchViewModel.News=news;
searchViewModel.Announcement=announcement;
List<SearchViewModel> searchViewModelList=new List<SearchViewModel> {searchViewModel};
return View(searchViewModelList.ToPagedList(pageIndex,dataCount));
}
SearchViewModel
public class SearchViewModel
{
public IEnumerable<News> News {get;set;}
public IEnumerable<Announcement> Annocument{get;set;}
}
Mes modèles ne sont pas nuls en vue. J'affiche tous mes titres de données après la recherche. PagedList a été affiché mais n'a qu'une seule page.
Recherche.cshtml
@model PagedList.IPagedList<MyProject.ViewModels.SearchViewModel>
@using PagedList
@using PagedList.Mvc
<div class=container>
@foreach (var item in Model)
{
foreach (var news in item.News)
{
@news.Title
}
foreach(var announcement in item.Announcement)
{
@announcement.Title
}
}
@Html.PagedListPager(Model,page=>Url.Action("Search",new {page=page}));
</div>
J'ai déjà utilisé PagedList dans mon projet. Mais je veux utiliser dans ViewModel. Où est mon erreur ?
1 réponse
ToPagedList()
est conçu pour fonctionner avec des modèles de données, pas avec des modèles de vue. Ce que vous faites actuellement est de retourner tous les enregistrements News
et Accouncement
de la base de données en appelant .ToList()
(ce qui va à l'encontre de l'objectif d'utiliser la pagination côté serveur), et en attribuant tous ces enregistrements à la propriété d'une instance de votre modèle de vue, puis en appliquant ToPagedList()
à cette instance unique.
Vous devez modifier les propriétés de votre modèle de vue en IPagedList<T>
, puis appliquer la pagination à chaque propriété, et non au modèle de vue lui-même. Votre modèle de vue doit être
public class SearchViewModel
{
public string SearchText { get; set; }
public IPagedList<News> News { get; set; }
public IPagedList<Announcement> Annoucements { get; set; }
}
Puis la méthode du contrôleur sera (notez que vos requêtes linq doivent inclure une clause orderby, mais je ne sais pas par quelle propriété vous souhaitez commander)
public ActionResult Search(string searchText, int? page)
{
int pageIndex = page ?? 1;
int dataCount = 20;
dbContext=new dbContext();
IQueryable<News> news = (from news in dbContext.News
where news.Title.Contains(searchText) orderby ?? select news);
IQueryable<News> announcements = (from announcement in dbContext.Announcement
where announcement.Title.Contains(searchText) orderby ?? select announcement);
SearchViewModel model = new SearchViewModel
{
SearchText = searchText,
News = news.ToPagedList(pageIndex, dataCount)
Annoucements = announcements.ToPagedList(pageIndex, dataCount)
};
return View(model);
}
Modifiez ensuite la vue pour
@model SearchViewModel
@using PagedList
@using PagedList.Mvc
... // your form with the input for SearchText
<div class=container>
@foreach (var news in Model.News)
{
@news.Title
}
@foreach(var announcement in Model.Announcements)
{
@announcement.Title
}
@if (Model.News.Count() > Model.Announcements.Count())
{
@Html.PagedListPager(Model.News, page=>Url.Action("Search",new { page = page, searchText = Model.SearchText }));
}
else
{
@Html.PagedListPager(Model.Announcements, page=>Url.Action("Search",new { page = page, searchText = Model.SearchText }));
}
</div>
Notez que le bloc if
garantit que les numéros de page sont affichés dans le cas où vous accédez aux pages suivantes où vous pourriez avoir des éléments News
mais aucun élément Announcement
ou vice versa. Cependant, cela ne garantit pas que le nombre total de pages sera correct (il pourrait y avoir par exemple 45 enregistrements correspondants News
et 65 enregistrements correspondants Announcement
)
Questions connexes
De nouvelles questions
asp.net-mvc
L'ASP.NET MVC Framework est un framework d'applications Web open source et un outil qui implémente une version du modèle MVC (Model-View-Controller) adaptée aux applications Web et basée sur une fondation technologique ASP.NET.