为什么要密封DataSourceSelectArguments?
有谁知道密封DataSourceSelectArguments背后的逻辑吗?
我已经为一些自定义业务对象和自定义WebControl实现了一个自定义DataSource(和相关类)。在考虑过滤器时(例如在网格中),我发现DataSourceSelectArguments是密封的。当然,我想念一些东西。 (也许逻辑与这样的事实有关,那就是无聊地再次询问数据库,只是为了进行过滤?只是一个猜测。)
解决方案
我的猜测是因为该类是一个哑数据传输对象,仅用于将参数传递给方法。
此类本身未定义任何操作,因此,我们期望哪种多态性?例如,现有方法将仅知道此类的属性,这些属性都是可设置的,因此无需覆盖属性。如果添加了新属性,它们将被忽略。
对于我们自己的方法,可以创建恰好具有所有相同属性的自己的Arguments类吗?
抱歉耽搁了,我在节假日。 :)
问题在于,诸如ListView之类的DataBoundControl具有SortExpression属性,但没有FilterExpression属性。可以通过触发PostBack和Command事件的IButtonControl WebControl来用ListView实现可排序的网格/列表。然后,我们可以使用SortExpression或者Sort方法,并传递将填充DataSourceSelectArguments.SortExpression的排序表达式,并将其传递给DataSource,该数据源可以构造适当的SQL语句(在我的情况下)以从数据库中检索数据。这样可以将数据与显示它的WebControl(恕我直言)分开。
按照这种模式,我将通过在DataSourceSelectArguments中使用请求的过滤器填充一个额外的参数对象来实现过滤器,我将调用Sort,它将将该参数对象传递给DataSource,在该处构造适当的select子句。
我终于通过在SortExpression中"编码"过滤器信息解决了它,但是我发现它很丑陋(首先是名称:sort!= filter),我想知道是否有更合适的方法这或者如果我缺少更微妙的东西。
编辑:
也许更好的方法是重写ListView的PerformSelect方法并询问我自己的DataSourceView实现是否可以过滤,然后调用特殊的ExecuteSelect方法,该方法接受带有过滤器的特殊DataSourceSelectArguments。目的。当然,当有人使用自定义的ListView和未增强的DataSourceView时,请当心不要做任何会破坏的事情。