分页.net MVC - 无需从WebService下载所有记录

时间:2016-07-14 11:45:59

标签: c# asp.net asp.net-mvc web-services pagination

我有以下问题。我想做很好的分页,我不想将所有记录从WebService下载到我的应用程序。

控制器代码:

public ActionResult Vacations(int? page)
        {
            int pageNumber = page ?? 1;
            int quantity = 5;
            using (MyWebService.MyWebServiceClient client = new MyWebService.MyWebServiceClient())
            {
                var vacations = client.GetUserAbsence(SessionManager.CurrentToken, quantity, pageNumber); 
                var onePageOfVacations = vacations.ToPagedList(pageNumber, quantity);
                ViewBag.OnePageOfVacations = onePageOfVacations;
            }
            return View();
        }

查看代码:

<h2>Vacations</h2>
<div>
    <table class="table tablesorter table-striped">
        <thead>
            <tr>
                <th>Data od</th>
                <th>Data do</th>
                <th>Ilość dni</th>
            </tr>
        </thead>
        <tbody>
            @{
                foreach (var v in ViewBag.OnePageOfVacations)
                {
                    <tr>
                        <td>@v.From_Date</td>
                        <td>@v.To_Date</td>
                        <td>@v.Element_Name</td>
                    </tr>
                }
            }
        </tbody>
        <tfoot>
            <tr>
                <th>Data od</th>
                <th>Data do</th>
                <th>Ilość dni</th>
            </tr>
        </tfoot>
    </table>
</div>

<!-- output a paging control that lets the user navigation to the previous page, next page, etc -->
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfVacations, page => Url.Action("Vacations", new { page }))

我的网络服务“GetUserAbsence()”中有一个方法,它返回到我需要的那些记录数。现在我只有一页,我无法显示其他结果。我的问题是 - 如何将此解决方案与PagedList连接,或者如何在此解决方案上创建新的分页?

1 个答案:

答案 0 :(得分:2)

MVC.PagedList有一个StaticPagedList方法,允许您提供IEnumerable<T>而不是IQuerable<T>,但您必须知道记录总数。在你的情况下,它将是

var vacations = client.GetUserAbsence(SessionManager.CurrentToken, quantity, pageNumber);
int totalItems = .... // see following note
ViewBag.OnePageOfVacations = new StaticPagedList<yourModel>(vacations, pageNumber, quantity, totalItems);

这意味着您的服务需要包含另一个返回总记录数的方法(但应该非常快),或者您可以修改GetUserAbsence()方法以返回包含已过滤属性的对象集合加上总记录的值。

附注:我建议您将强类型模型传递给视图而不是使用ViewBag,以便控制器代码

....
var model = new StaticPagedList<yourModel>(vacations, pageNumber, quantity, totalItems);
return View(model);

并在视图中

@model PagedList.IPagedList<yourModel>
....
@foreach (var v in Model)
{
    ....
}
....
@Html.PagedListPager(Model, page => Url.Action("Vacations", new { page }))