我没有使用网格,只使用MvcContrib寻呼机。我为寻呼机创建了一个局部视图(因此我可以轻松地在结果的顶部和底部显示它),并且它调用@Html. Pager
方法:
@Html.Pager(Model.PagedPrograms).First("<<").Last(">>").Next(">").Previous("<").Format("Item {0} - {1} of {2} ")
只要所有参数都通过QueryString传递给页面,这就无需额外调整,因为Pager知道要重新构建这些URL。
我想给用户提供更改页面大小的选项(例如20,50,全部)...我可以轻松地在控制器端处理它,我可以编写类似
的内容@if (Model is Foo) {
@Html.ActionLink<SearchController>(sc => sc.Foo(var1, var2, var3, 20), "20")
@Html.ActionLink<SearchController>(sc => sc.Foo(var1, var2, var3, 50), "50");
@Html.ActionLink<SearchController>(sc => sc.Foo(var1, var2, var3, -1), "All");
}
但我必须为每个可能使用此传呼机的模型类型执行此操作...我可能会过度思考或完全倒退,但我想我会问,看看是否有人有洞察力。
目前只有从IPagedProgramList
(提供IPagination<ProgramDTO> { get; }
)的视图调用寻呼机,我有两个实现该界面的ViewModel(简单搜索和高级搜索)。但是如果这个项目增长并且我们添加了使用该接口的新ViewModel,我将不得不更新Pager局部视图,这看起来很糟糕/不会扩展/等等。
答案 0 :(得分:1)
所以向Ek0nomik致意,让我开始思考这个问题。
步骤1:确保将要使用寻呼机控制器的所有页面都通过GET而不是POST传递所有参数。如果你必须在某个地方接受帖子并且只是将所有参数翻译成GET方法的原始类型,请使用RedirectToAction。
第2步:不要担心将.Link()
添加到寻呼机。只要一切都通过GET进入,你就没事了。它将查看页面的URL并根据您前进/后退时的需要调整页码参数。
步骤3(可选但建议):为了在您的应用程序,某处(可能是您的Global.ascx.cs文件)中保持一致性,您应该定义一个您将支持的页面大小列表。在我的情况下,我使用了Dictionary<int,string>
,因此我可以将-1
作为PageSize
值传递,但显示All
(当然数据层必须知道-1
表示禁用分页)。
第4步:在寻呼机局部视图中添加以下内容:
<ul class="pageSizeSelector">
@foreach (KeyValuePair<int,string> kvp in MvcApplication.AVAIL_PAGE_SIZES)
{
<li><a href="#" onclick="changePageSize(@kvp.Key)">@kvp.Value</a></li>
}
</ul>
第5步:javascript函数changePageSize
非常简单,我简直不敢相信我没想到这一点(注意:不需要jQuery ...以防万一你还没有使用它,你不需要为此而努力。)
function changePageSize(size) {
var PSpattern = /PageSize=\d+/i;
var url = window.location.href;
url = url.replace(PSpattern, "PageSize=" + size);
window.location.href = url;
}
第6步(可选,除非你是互联网巨魔):利润!