MvcContrib寻呼机 - 更改页面大小

时间:2012-06-14 16:28:17

标签: asp.net-mvc-3 razor mvccontrib

我没有使用网格,只使用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局部视图,这看起来很糟糕/不会扩展/等等。

1 个答案:

答案 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步(可选,除非你是互联网巨魔):利润!