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 ?

0
Developer007 26 juil. 2018 à 09:33

1 réponse

Meilleure 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)

1
user3559349user3559349 26 juil. 2018 à 15:49