将DataTable分配给ViewState是一个好的方法吗?

5

我从数据库中获取了一个DataTable并将其分配给ViewState,如下所示:因为我不想每次都访问数据库。

DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;

GetDataTable()是一个方法,它从数据库中检索1000条记录。这是最好的方法吗?还有其他更好的处理方式吗?


这个回答解决了你的问题吗?ViewState Vs Session ... maintaining object through page lifecycle - undefined
5个回答

9
首先,不管怎样,还是要根据您的需求和环境设置来确定。ViewState 存储在一个隐藏字段中,作为生成的 HTML 中的 <input /> 标签。当用户发起回发(例如单击按钮等)时,数据将作为提交的表单数据的一部分发送回服务器。如果在 ViewState 中存储大量数据,则在用户尝试下载页面时会产生惩罚,因为所有这些数据都将成为您的 HTML 的一部分,并且当用户尝试提交表单时,此数据再次将被发送回服务器。此外,ViewState 非常容易丢失。它仅在用户提交表单期间保留。如果用户单击到另一页的链接,则不会提交表单,因此 ViewState 中包含的数据将丢失。建议只在数据相对较小的情况下使用 ViewState。就安全选项而言,ViewState 数据以 base64 编码,可以轻松解码。这是黑客攻击网站的典型例子,因此请交叉检查您存储的确切数据。虽然您可以通过将 EnableViewStateMac 设置为 true 来解决此问题。

对于大量数据,Session是一个不错的选择。如果您能够检测到任何用户完成了特定数据块,则将Session变量设置为null以抵消内存开销。您并不总是能够做到这一点,但是Session将过期并且内存将自动回收。降低Session超时时间也可以帮助,但需要根据要求进行设置。

此外,Session中的数据实际上存在于页面加载之间的Web服务器上。这有助于保持页面大小较小,它只需使用Session ID。

最后一个选项是使用缓存。请查看MSDN这里有关缓存的最佳实践。


那么Session和Cache是最好的方式吗? - thevan
2
我更相信缓存,因为DataTable通常包含站点范围数据,例如在GridView中使用的数据。Session主要用于用户特定数据。如果您必须按用户存储DataTable,则Session确实是一个不错的选择。 - R.C

2

视图状态副作用

1)它被序列化为输入值并在返回时反序列化。

2)ViewState存储在表单的隐藏标签中。当用户发起回发(例如点击按钮)时,数据作为表单数据的一部分返回到服务器。这可能会减慢速度。

3)ViewState很容易丢失。只有在用户提交表单时才保留它。如果用户点击超链接转到另一页,则不会提交表单,并且ViewState中包含的所有数据都将丢失。即使锚点指向用户当前正在使用的页面也是如此。

我将使用ASP.NET缓存来存储这些数据表,原因如下。

1)缓存具有过期时间,这意味着可以根据滑动或绝对过期时间自动删除它

2)如果进程的内存“压力”太高,则缓存将自动删除。

3)您可以根据其键将缓存项设置为特定于一个用户或全局于所有用户。


使用Session怎么样?Session比ViewState更好吗? - thevan
会话变量将为每个不同的用户使用不同的会话变量。通常可以在会话中存储大量数据,但是具有大量流量的网站通常不会使用此方法,因为它会对服务器内存造成严重负担。 - Sain Pradeep

0

视图状态是一种很好的存储数据表的方式

将数据表存储到视图状态中 DataTable dt = new DataTable(); ViewState["dttable"] = dt;

现在可以将ViewState中的数据转换为数据表

DataTable dtnin = (DataTable)ViewState["dttable"];


0

ViewState 不是一种不好的方式,但当处理大量数据时,最好将数据保存在一个带有可控过期日期的 Session 变量中。


0

使用DataTable是可行的。但是DataTable基本上是一个动态对象,视图中的代码往往很难调试。

我建议创建一个包含所需属性的类或结构体。然后将DataTable转换为此类的列表实例,并将其发送到视图。

这将使代码更易读,因为现在任何程序员都可以看到您正在尝试检索哪些数据。它还将防止您不断调试视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接