代码之家  ›  专栏  ›  技术社区  ›  fdfrye

ASP.NET网格视图:好的或坏的/要用于绑定的数据类型是什么?

  •  0
  • fdfrye  · 技术社区  · 14 年前

    所以,这个问题可能有点含糊,但我一直在讨论:

    在设计一个ASP.NET页面时,很多时候您可能只想在页面上抛出一个快速而脏的网格视图。当您走该路线时,您有各种数据源选项(我通常使用绑定到业务对象的ObjectDatasource),您也可以手动绑定。

    我看到了很多关于数据类型可以自动在网格中提供排序功能的变化。我见过人们将他们的自定义POCO集合逐字地转换为业务对象中的数据表,这样网格视图就可以更容易地支持这些类型的行为。

    通过自己处理所有可用的事件(OnSorting、OnUpdating等),您可以真正从网格视图中获得许多不同的行为,并且从长远来看,它最终可以高度定制。即使如此,您也可能会遇到其他一些小问题,比如无法使用“回车”键自动执行给定行的更新操作。这是因为页面上的默认按钮可能在GridView之外,而ASP.NET只允许您为给定面板指定默认按钮,并且不允许对GridView模板内的按钮执行此行为。这只是一个例子,请注意。当然,还有一个问题,即页面是否应在每次筛选操作时返回到数据源,或者整个数据源是否应缓存在页面的视图状态中,以允许在不访问数据库的情况下进行筛选/排序…

    因此,这里有一个终极问题:在需要基本CRUD操作的页面上使用GridView是否合理,即使这可能意味着将自定义集合转换为某种数据表?应该完全放弃网格视图而选择数据列表、列表视图或转发器之类的东西吗?后一个选项当然可能更灵活,但这是否意味着处理默认的行选择、编辑、排序等。应该为每个场景重建GridView的功能?

    对这个问题的任何合理的想法都表示赞赏!

    2 回复  |  直到 13 年前
        1
  •  1
  •   fdfrye    14 年前

    我刚刚意识到这个问题仍然存在,所以我的结论是:

    我仍然认为在ASP.NET页面中嵌入标准的GridView控件很有用。我仍然认为处理页面代码隐藏中的每一个排序事件是不合理的,因为它会造成真正的维护噩梦,并使您的数据交互和业务逻辑代码过于接近MVC术语中的“视图”…

    我所不知道的是网格视图与各种数据源控件的紧密集成程度。我知道,在适当的情况下,当连接到一个sqldatasource时,一个GridView会在应用自己的排序和分页技术的同时,直接对数据库执行各种CRUD操作,但这并不能很好地转化为将一个ObjectDatasource与一个业务对象一起使用——我这样认为。

    事实证明,ObjectDatasource控件有三个关键属性,允许它动态地为业务对象提供带有排序和分页参数的方法。

    这些属性包括:SelectCountMethod、SortParameterName、StartRowIndexParameterName和MaximumRowParameterName。这些属性与所需的EnablePaging标志一起更改了“Select”方法的预期签名,并使用SelectCount方法自动启动以获取返回的总可能记录数,使用GridView的页面大小和当前状态来确定结果集中从何处开始以及有多少项o选择超过该起点,并开始提交SQL样式的排序表达式以及对select方法的所有调用。

    总而言之,这是向前迈出的一大步,但是如果您正在使用POCO类的自定义集合,或者对LinqToSQL或EF对象上下文执行查询,您仍然需要将StartRowIndex和MaximumRow参数转换为某种形式的Skip()。Take()组合(非常简单和明显)并转换排序表达式转换为针对对象上下文或内存集合的某种类型的查询。

    我不会在这里讨论所有冗长的细节,但基本上,解决方案是使用动态LINQ功能和反射来针对内存中的集合定义一个查询表达式,只需要继续排序字符串。

    排序字符串将以典型的“field name desc”格式包含字段名和排序方向(仅当降序时)。通过分析此字符串,可以使用特定类型上的反射,使用排序字符串中匹配的属性名创建表达式。

    这里的主要好处是,只需对select方法进行一些调整,并使用自定义的linq扩展来处理将排序字符串转换为lambda表达式的过程,您就可以开始日常工作,将网格视图连接到具有内置排序和分页功能的业务逻辑。

    因为在最初的问题中提到了这个问题,所以我会注意到,这个解决方案实际上会在每次页面加载时都对数据库造成影响,但最终返回的数据量应该更小,更有针对性。

        2
  •  1
  •   Brian    13 年前

    几年来,我第一次不得不使用网格视图,现在我想起来为什么我这么久没有使用它们了。网格视图非常适合基本级别的设计,但不幸的是,大多数时候最终用户都希望获得更多的功能,而这正是他们开始欠缺的地方。正如您所指出的,虽然您可以自定义和扩展网格视图,但这会打开一个完全不同的蠕虫罐头。所以对于我来说,我试图坚持使用网格视图作为生成报告的工具。除此之外,我似乎花了很多时间对它进行定制和调整,以获得接近我需要的东西,但这并不值得付出努力。