当前分页实现的设计问题


12

我已经在asp.net mvc上专门检查了分页实现,我真的觉得实现中的效率较低。

首先,所有实现都使用如下所示的分页值。

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

我觉得不对的是pageIndex和pageSize完全应该是Pagination类的成员,否则这种方式看起来功能太多。它还简化了应用程序层中不必要的参数传递。

第二件事是他们使用下面的界面。

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    int PageNumber { get; }
    int PageSize { get; }
    bool HasPreviousPage { get; }
    bool HasNextPage { get; }
    bool IsFirstPage { get; }
    bool IsLastPage { get; }
} 

如果我想将分页路由到其他动作,那么我必须创建新的视图模型以在其中封装动作名称甚至控制器名称。另一个解决方案可以是,发送此接口模型以进行查看,然后将在分页器方法中硬编码的操作和控制器指定为参数,但是我完全失去了视图的可重用性,因为它严格依赖于一个操作。

另一件事是,他们使用以下代码查看

Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)

如果模型是IPagedList,为什么它们不提供类似@Html.Pager(Model)甚至更好的重载方法@Html.Pager()。您知道我们以这种方式知道模型类型。在我做错之前,因为我使用的是Model.PageIndex而不是Model.PageNumber。

另一个大问题是它们强烈依赖IQueryable接口。他们怎么知道我在数据层中使用IQueryable?我希望它们只与使分页实现持久性无知的集合一起工作。

我的分页实现中的改进想法有什么问题?他们为何不采用这种方式进行分页的原因是什么?


在我看来,这很复杂。并不是我完全了解问题的确切原因,但是...您真的需要使用内置帮助器吗?我什至不知道他们有传呼机。自从我的第一次(也是失败的)尝试与内置帮助程序相处之后,自MVC 1 Beta以来,我已经开发了一系列自己的帮助程序。我向您推荐相同的内容。如果您在与这些助手一起挣扎,那么这比在服务器控件上挣扎的WebForms更好。

ASP.NET MVC没有内置的分页助手,只有第三方分页实现。
Freshblood 2011年

谢谢您提供的信息。问题是,为什么需要一个?就像您想要的那样,无需您自己实施它。

我只是想知道我的想法有问题。我是否违反了一些核心原则,所以为什么所有人都遵循相同的设计实现..我不明白
Freshblood 2011年

如果代码不能解决程序员的问题,那么代码就没有价值,您最好避免使用它。
Shaheer 2011年

Answers:


1

如user8685所述:您的界面似乎对现有的MVC内容和原理而言是多余的。

尝试以下操作:IPagedList所需的信息(例如页面索引等)应在业务逻辑层中实现,并通过通用模型反馈到视图/页面,该模型可以反馈到服务器并在其中安全地进行转换和处理。为什么?因为您在这里收集的显然是信息系统的输入,因此属于低于UI的图层。

这种方法可能不是最好的方法,当然也不是最快的方法,但是应该可以更轻松地了解抽象和数据体系结构方面的真正需求,从而帮助您消除冗余。

而且,现有的助手通常包含太多的开销,以至于无法简单使用,有时甚至混淆了全局。


0

没用过这个IPagedList或帮助器,但这是我的看法:

MostPopular(int pageIndex,int pageSize)是一个明确的接口,指出:我将仅返回MostPopular事物的页面。您明确告诉我哪一页及其大小。

如果他们采用了控制器方法,MostPopular(IPagedList<T> page)则界面会变得更加混乱。您是否告诉控制器项目的总数?

当控制器检索到您的特定页面分片的数据时,它通常可以发现各种其他数据,例如总共有多少个项目。此时,将此类数据返回到视图很有意义,因此它可以有选择地使用其中的一些数据。

这并不意味着IPagedList是模型中,它也可以同样是一部分的模型(上一个属性)。这可能是为什么没有无参数重载的原因。

他们本可以将IPagedList添加为过载,但是您将需要将一组(分页的数据)传递给一个不需要实际数据本身的小寻呼机助手。它只需要知道当前有多少个页面/项目以及您现在在哪里,就可以突出显示页面编号等。您会告诉帮助者更多的信息,而不是它需要知道的工作。现在它的工作方式具有较低的耦合,这是一件好事。


我只是想说操作方法参数可以是具有名为PageIndex和PageSize的属性的对象,因此通过这种方式,我们可以轻松地验证模型,因为有人可能会推送大量页面大小来攻击服务器性能。如果它们提供无参数重载,那么当模型为IPagedList时,无参数重载将可用。如果我要传递更多的数据,那么助手没有任何问题。没有最佳实践这样的严格规则。
Freshblood 2012年

0

考虑到客户要求的页码以及客户最有可能改变的是页面大小,我认为:

public ActionResult MostPopulars(int pageIndex,int pageSize)

这是一种非常明智的方法。我已经看到了使用枚举(第一,下一个,上一个,最后一个)的变体,但实际上这只是说“ pageIndex”的一种尴尬方式。

我要重申的是,页面大小将会并且应该变化很大,具体取决于所涉及的查看器,您应该为移动设备,便携式设备和大屏幕工作站获得不同的默认值,此外,在很多情况下,让最终用户选择包含多少项是明智的页面。

我知道这会导致在MVC框架中传递大量参数,但是分页的整个概念破坏了MVC -您的业务逻辑需要了解表示才能使分页正常工作,因此它总是很混乱。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.