![]() |
1
1
我刚刚意识到这个问题仍然存在,所以我的结论是: 我仍然认为在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
几年来,我第一次不得不使用网格视图,现在我想起来为什么我这么久没有使用它们了。网格视图非常适合基本级别的设计,但不幸的是,大多数时候最终用户都希望获得更多的功能,而这正是他们开始欠缺的地方。正如您所指出的,虽然您可以自定义和扩展网格视图,但这会打开一个完全不同的蠕虫罐头。所以对于我来说,我试图坚持使用网格视图作为生成报告的工具。除此之外,我似乎花了很多时间对它进行定制和调整,以获得接近我需要的东西,但这并不值得付出努力。 |
![]() |
Melanie · ASP。子项未继承Net MenuItem格式 7 年前 |
![]() |
Diego Razquin · Asp:按钮及其控制器 7 年前 |
![]() |
Chan Yoong Hon · 导航到新页面并显示警报框 7 年前 |