C# 存储web自定义控件数据的位置

C# 存储web自定义控件数据的位置,c#,asp.net,viewstate,C#,Asp.net,Viewstate,我正在创建一个扩展WebControl的自定义控件。此web控件允许使用者在标记中定义列集合,如下所示: <Custom:CustomGrid> <Columns> <Custom:DataColumn HeaderText="FirstName" /> <Custom:DataColumn HeaderText="LastName" /> </Columns> 并将IEnumerable放入数据源属性中,然后将

我正在创建一个扩展WebControl的自定义控件。此web控件允许使用者在标记中定义列集合,如下所示:

<Custom:CustomGrid>
<Columns>
    <Custom:DataColumn HeaderText="FirstName" />
    <Custom:DataColumn HeaderText="LastName" />
</Columns>

并将IEnumerable放入数据源属性中,然后将其呈现到表中。 此控件还允许分页。数据源中的IEnumerable是完整列表,我一次显示一页列表。我已经将当前页面、每页行数等保存到viewstate。我是否也应该将完整列表置于viewstate中?也许是第二节课? 这个列表可能会有点大。可能使用随机键保存在会话中,该键保存在viewstate中? 这里的最佳实践是什么

编辑:我认为强制IEnumerable中的所有类型都可以序列化是不对的。这公平吗?那么,我是否需要将数据源复制到其他数据结构以进行序列化


编辑2:即使我使用基本控件而不是实现RenderChildControls,我也需要实现CreateChildControls,但我仍然需要将数据保存在某个地方,还是我没有抓住基类的要点?

要实现数据绑定控制,最好使用设计用于执行此类任务的基类。例如,在ASP.NET中存在CompositeDataboundControl,它可以用作实现自定义数据绑定控件的基类。我可以建议您阅读以下Dino Esposito文章:


基本上,如果您创建类似ASP.NET gridview的控件,那么它将在viewstate中存储值。更清楚的是,它创建了一些DataRow控件,这些控件在viewstate中保存了指定的值。在回发过程中,它会重新创建相同数量的行,并从viewstate恢复值。如果只保存数据源(例如在会话中),而不使用viewstate,则在每次回发期间,需要将数据重新绑定到网格。因此,如果您创建类似于gridview的服务器控件,那么Dino Esposito文章中描述的方法将非常有用,因为它展示了如何创建类似于ASP.NET服务器gridview控件的控件。

事实上,并非所有的
IEnumerable
实例都是可序列化的

如果查询的运行成本很低,我不会持久化整个数据集,而只是针对不同的页面或排序顺序的更改再次运行查询

如果将数据放在viewstate中,最终将得到巨大的页面。如果用户不多,会话状态可能是可以接受的,但是具有大量用户的大型数据集无法很好地扩展。如果我把一百万行绑定到你的控件上呢?或者,如果您的控件在中继器中使用,并且在一个页面上显示100次,该怎么办

您确定需要保留数据吗?这不是过早的优化,是吗

请记住,控件是一个UI组件。viewstate应包含足够的信息,以保持UI状态不变。状态的更改(例如:切换到不同的结果页)是您的控件应该将责任转移给数据源的事情


看看好的旧
GridView
。它会显示你给它的东西,并记住这一点。如果您正在使用分页,那么它会引发一个事件,说“用户已更改页面;请给我第x页的数据”。对我来说,这是UI控件的最佳实践。

我的大多数控件都是手动呈现的(并且是纯HTML控件,而不是服务器控件),因此我不能指望控件保留自己的viewstate。这或多或少就是我最终要做的。由于数据集不是很大,我只是将每次回发时设置DataSource属性的责任传递给消费页面,并且我只在ViewState中存储将DataSource恢复到以前状态所需的内容。