1

我没有使用网格,只是使用 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(provides IPagination<ProgramDTO> { get; }) 的视图中调用,并且我有两个 ViewModel 实现该接口(一个简单搜索和一个高级搜索)。但是,如果这个项目增长并且我们添加了使用该接口的新 ViewModel,我将不得不更新 Pager 部分视图,这看起来很糟糕 / 无法缩放 / 等等。

4

1 回答 1

1

所以向 Ek0nomik 致敬,他让我在这个问题上跳出思维定势。

第 1 步:确保所有将使用 Pager 控制器的页面都通过 GET 而不是 POST 传递所有参数。如果您必须在某处接受 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 步(可选,除非您是网络巨魔):盈利!

于 2012-06-15T17:48:55.867 回答