在剃刀视图中设置页面大小DropDownList



我想在我的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 }) )

最新更新