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

时间:2013-09-16 06:53:23

标签: c# asp.net datatable viewstate state-management

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

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

GetDataTable()是一种方法,它从DataBase中检索1000条记录。 这是最好的方法还是最好的方法来处理这个问题?

5 个答案:

答案 0 :(得分:7)

首先要做的事情:除了解释之外,它仍然在很大程度上取决于您的要求,环境设置......

视图状态存储在隐藏字段中,该字段呈现为发送到浏览器的最终HTML中的<input />标记。当用户启动回发(按钮单击等)时,数据将作为提交的表单数据的一部分发送回服务器。

如果您在ViewState中存储大量数据,则当用户尝试下载页面时,您将不得不受到惩罚,因为所有此类数据都将成为HTML的一部分,并且当用户尝试提交表单时也是如此再次将此数据发送回服务器。

此外,ViewState很容易丢失。只要用户提交表单,它就会被保留。如果用户单击指向另一个页面的超链接,则不会提交表单,因此ViewState中包含的数据将丢失。

如果数据相对较小,建议使用ViewState。

如果我们考虑安全选项,ViewState数据将以base64编码,可以轻松解码。这是黑客攻击网站的典型示例,因此请交叉检查您正在存储的数据。虽然您可以通过将EnableViewStateMac设置为true来解决此问题。

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

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

最后一个选项是使用Caching.Check MSDN here for the best practices on Caching.

答案 1 :(得分:2)

查看状态副作用

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

2)视图状态存储在表单上的隐藏标记中。当用户启动回发时(例如,通过单击按钮),数据将作为表单数据的一部分返回到服务器。它可能会减慢速度。

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

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

1)缓存有一个到期时间,这意味着您可以根据滑动或绝对到期时间值自动删除它

2)如果进程内存&#34;压力&#34;将自动删除缓存。太高了。

3)您可以根据一个用户创建一个特定于某个用户的缓存项目,或者根据所述用户创建一个全局用户

答案 2 :(得分:0)

ViewState并不是一个糟糕的方法,但是在处理大数据时,最好将数据保存在一个可以控制的失效日期的Session变量中

答案 3 :(得分:0)

使用DataTable会起作用。但是,DataTable基本上是一个动态对象,视图中的代码往往难以调试。

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

这将使代码更具可读性,因为现在任何程序员都可以看到您尝试检索的数据。它会阻止你不得不调试视图。

答案 4 :(得分:0)

View State是在视图状态下存储数据表的好方法

将数据表存储到viewstate中 DataTable dt = new DataTable(); 的ViewState [&#34; dttable&#34] = DT;

现在ViewState数据进入Datatable

DataTable dtnin =(DataTable)ViewState [&#34; dttable&#34;];