我想在我的asp.net网页表单中用下拉列表选择页面大小。事实上,我已经做到了,但当我从下拉列表中更改页面大小时,不会有任何变化。我想我需要在我的控制器中写一些额外的东西,或者我的视图可能错了?
我的Index.chtml视图:
@model TimeReportingWebApp.TimeReportViewMod
@using PagedList.Mvc;
....
@using (Html.BeginForm("Index", "Users"))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" class="btn btn-primary" value="Search" />
</p>
}
<table class="table">
<tr>
<th>@Html.ActionLink("Login","Index", new { sortOrder = ViewBag.LoginSortParm, currentFilter = ViewBag.CurrentFilter })</th>
</tr>
@foreach (var item in Model.Model2) {
<tr>
<td>@Html.DisplayFor(modelItem => item.Login)</td>
</tr>
}
</table>
Page @(Model.Model2.PageCount < Model.Model2.PageNumber ? 0 : Model.Model2.PageNumber) of @Model.Model2.PageCount
@Html.PagedListPager(Model.Model2, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }) )
Select page size @Html.DropDownList("PageSize", new SelectList(new Dictionary<string, int> { { "10", 10 }, { "20", 20 }, { "100", 100 } }, "Key", "Value", Model.Model2.Count))
这是我的控制器。在这里,我没有添加任何关于DropDownList:的内容
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var users = from s in db.Users.Include(u => u.CustomerProject).Include(u => u.Service).Include(u => u.Customer) select s;
int pageSize = 20;
int pageNumber = (page ?? 1);
var inst = new TimeReportViewMod();
inst.Model1 = users.ToList();
inst.Model2 = users.ToPagedList(pageNumber, pageSize);
return View("Index", inst);
}
您需要在<form>
标记中包含dropdownlist,以便将其值提交给控制器方法,该方法还需要一个附加参数来绑定到该值。您还需要在Html.PagedListPager()
中包含选定的值,以便在转到另一页时保留该值。
您还没有显示您的TimeReportViewMod
模型,但它包含属性IEnumerable<User>
和IPagedList<User>
,这也是IEnumerable<User>
,因此第一个是不必要的。但它应该包含用于搜索和筛选的属性,这样您就可以强绑定到您的属性并避免使用ViewBag
。它应该看起来像
public class TimeReportVM
{
[Display(Name = "Find by name")]
public string SearchString { get; set; }
public string SortOrder { get; set; }
[Display(Name = "Select page size")]
public int PageSize { get; set; }
public SelectList PageSizeList { get; set; }
public IPagedList<User> Users { get; set; }
}
注意:目前还不清楚sortOrder
的用途——你永远不会在任何地方使用它。您也从未在查询中使用过searchString
/currentFilter
的值。
那么你的控制器方法是
public ActionResult Index(string sortOrder, string searchString, int pageSize, int? page)
{
if (searchString != null)
{
page = 1;
}
// this query should be taking into account the values of sortOrder and searchString?
var users = from s in db.Users.Include(u => u.CustomerProject).Include(u => u.Service).Include(u => u.Customer) select s;
TimeReportVM model = new TimeReportVM()
{
SortOrder = sortOrder,
SearchString = searchString,
PageSize = pageSize,
PageSizeList = new SelectList(new int[]{ 10, 20, 100 }),
Users = users.ToPagedList(page ?? 1, pageSize);
};
return View(model);
}
并且在视图中
@model TimeReportingWebApp.TimeReportViewMod
@using PagedList.Mvc;
....
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.SearchString)
@Html.TextBoxFor(m => m.SearchString)
@Html.LabelFor(m => m.PageSize)
@Html.DropDownListFor(m => m.PageSize, Model.PageSizeList)
<input type="submit" class="btn btn-primary" value="Search" />
}
....
Page @(Model.Users.PageCount < Model.Users.PageNumber ? 0 : Model.Users.PageNumber) of @Model.Users.PageCount
@Html.PagedListPager(Model.Users, page => Url.Action("Index",
new { page, sortOrder = Model.SortOrder, searchString = Model.SearchString, pageSize = Model.PageSize }) )