【问题标题】:MvcContrib Pager - Change Page SizeMvcContrib Pager - 更改页面大小
【发布时间】:2012-06-14 16:28:17
【问题描述】:

我没有使用网格,只是使用 MvcContrib 寻呼机。我为 Pager 创建了一个局部视图(因此我可以轻松地将其显示在结果的顶部和底部),它调用 @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&lt;ProgramDTO&gt; { get; })的视图调用 Pager,并且我有两个 ViewModel 实现该接口(简单搜索和高级搜索)。但是,如果这个项目增长并且我们添加了使用该接口的新 ViewModel,我将不得不更新 Pager 部分视图,这似乎很糟糕 / 无法缩放 / 等等。

【问题讨论】:

  • 难道你不能只有一个 HTML &lt;select&gt; 标签来控制页面大小吗?给元素一个 id 为pageSize,然后在 ActionResult 中查找该参数(确保它可以为空)并相应地设置页面大小?如果为null,则设置一个默认值。
  • 我认为你正在做一些事情,尽管它有点棘手。我想我要尝试的是使用带有 jQ​​uery 的 select ...onchange(function() { $(".pager a").each(... // replace PageSize parameter ); }); 这可能有效,但我不确定,而且似乎比它应该的更难。 :)

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


【解决方案1】:

向 Ek0nomik 致敬,他让我在这个问题上跳出框框思考。

第 1 步:确保所有要使用 Pager 控制器的页面都通过 GET 而不是 POST 传递所有参数。如果您必须在某处接受帖子并将所有参数转换为 GET 方法的原始类型,请使用 RedirectToAction。

第 2 步:不要担心将 .Link() 添加到寻呼机。只要一切都是通过 GET 进来的,你就没事。当您前进/后退时,它将查看页面的 URL 并根据需要调整页码参数。

第 3 步(可选但推荐):为了在您的应用程序中保持一致性,您应该在某个地方(可能是您的 Global.ascx.cs 文件)定义您将支持的页面大小列表。在我的例子中,我使用了Dictionary&lt;int,string&gt;,这样我就可以将-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 步(可选,除非您是网络巨魔):盈利!

【讨论】:

  • 从技术上讲,如果你希望你的 HTML 很丑但避免使用 JS,你可以使用 MVC 将当前 URL 获取为字符串,然后使用 RegEx 对象替换 PageSize 就像我们一样用JS做的,所以选择你的毒药。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多