ASP.NET MVC 分页不适用于 ViewModel
ASP.NET MVC Pagination Not Working on ViewModel
我在我的项目中使用分页。我有搜索框并将搜索文本发送到操作结果。
我遇到了搜索 ActionResult 的断点。我的新闻和公告在 select 个查询后正在填充。
搜索操作结果
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 中使用。我哪里错了?
ToPagedList()
旨在使用数据模型,而不是视图模型。您当前正在做的是 returns 通过调用 .ToList()
从数据库中获取所有 News
和 Accouncement
记录(这违背了使用服务器端分页的全部目的),并且分配所有这些记录到视图模型的一个实例的 属性,然后将 ToPagedList()
应用于该单个实例。
您需要将视图模型属性更改为 IPagedList<T>
,然后将分页应用到每个 属性,而不是视图模型本身。你的视图模型应该是
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
记录)
我在我的项目中使用分页。我有搜索框并将搜索文本发送到操作结果。
我遇到了搜索 ActionResult 的断点。我的新闻和公告在 select 个查询后正在填充。
搜索操作结果
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 中使用。我哪里错了?
ToPagedList()
旨在使用数据模型,而不是视图模型。您当前正在做的是 returns 通过调用 .ToList()
从数据库中获取所有 News
和 Accouncement
记录(这违背了使用服务器端分页的全部目的),并且分配所有这些记录到视图模型的一个实例的 属性,然后将 ToPagedList()
应用于该单个实例。
您需要将视图模型属性更改为 IPagedList<T>
,然后将分页应用到每个 属性,而不是视图模型本身。你的视图模型应该是
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
记录)