【问题标题】:ASP.NET MVC Pagination Not Working on ViewModelASP.NET MVC 分页在 ViewModel 上不起作用
【发布时间】:2018-07-26 06:33:47
【问题描述】:

我在我的项目中使用分页。我有搜索框并将搜索文本发送到操作结果。

我在 Search ActionResult 中找到了断点。选择查询后,我的新闻和公告正在填写。

搜索操作结果

 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;}    
}

我的模型在视图中不为空。搜索后我正在显示我的所有数据标题。 PagedList 已显示,但只有 1 页。

Search.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>

我之前在我的项目中使用了 PagedList。但我想在 ViewModel 中使用。我哪里错了?

【问题讨论】:

  • 你只创建了一个`searchViewModel 的实例——在一条记录上使用分页是没有意义的。而且您的代码正在从数据库中获取所有记录,而不仅仅是您想要的 20 条记录。而ToPagedList() 设计用于处理数据模型(您使用IQueryable&lt;T&gt;,而不是List&lt;T&gt;),而不是查看模型(因为您可以使用StaticPagedList
  • @StephenMuecke 感谢您的回答。我已经从数据库中获取了所有数据。 20是为了尝试。我的代码应该如何?我会将 List 更改为 IQueyable 吗?
  • 服务器端分页的全部意义在于只从数据库中获取您想要的记录(即只有 20 条,而不是全部)。而且您不能将 PagedList 用于 2 个模型(无论如何这没有任何意义,因为每个模型的项目数量不同)
  • @StephenMuecke 我明白了。但我需要从 2 个表中获取数据。我只在我的代码中将 List 更改为 IQueryable ?
  • @StephenMuecke 我已经看过了。你在第一篇文章中写了你的 use 和 IQueryable 。我在问如何在没有 ViewModels 的情况下解决我的问题?

标签: asp.net-mvc pagination pagedlist


【解决方案1】:

ToPagedList() 设计用于处理数据模型,而不是视图模型。您当前正在做的是通过调用.ToList()(这违背了使用服务器端分页的全部目的)从数据库中返回所有NewsAccouncement 记录,并将所有这些记录分配给一个实例的属性您的视图模型,然后将ToPagedList() 应用于该单个实例。

您需要将视图模型属性更改为IPagedList&lt;T&gt;,然后将分页应用到每个属性,而不是视图模型本身。你的视图模型应该是

public class SearchViewModel
{
    public string SearchText { get; set; }
    public IPagedList<News> News { get; set; }
    public IPagedList<Announcement> Annoucements { get; set; }
}

然后控制器方法将是(注意你的 linq 查询需要包含一个 orderby 子句,但我不知道你要按哪个属性排序)

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);
}

然后修改视图为

@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>

请注意,if 块可确保在您导航到可能有一些 News 项目但没有 Announcement 项目的后续页面的情况下显示页码,反之亦然。但是,这并不能保证总页数是正确的(可能有 45 个匹配的 News 记录和 65 个匹配的 Announcement 记录)

【讨论】:

  • 再次感谢您 :) 这是非常明确的解决方案。
猜你喜欢
  • 2015-08-05
  • 2017-01-26
  • 2018-03-12
  • 1970-01-01
  • 2011-04-29
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多