C# 将DataTable分配给ViewState是一种好方法吗?

C# 将DataTable分配给ViewState是一种好方法吗?,c#,asp.net,datatable,viewstate,state-management,C#,Asp.net,Datatable,Viewstate,State Management,我从数据库中获取一个DataTable并分配给ViewState,如下所示:因为我不想每次都访问数据库 DataTable dt = GetDataTable(); ViewState["dtTable"] = dt; GetDataTable()是一种从数据库中检索1000条记录的方法。 这是最好的方法还是哪种方法是最好的处理方法?ViewState不是一个坏方法,但在处理大数据时,最好将数据保存在具有到期日期的会话变量中,您可以控制查看状态的副作用 1) 它被序列化为输入值,并在返回时反序

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

DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
GetDataTable()
是一种从数据库中检索1000条记录的方法。
这是最好的方法还是哪种方法是最好的处理方法?

ViewState不是一个坏方法,但在处理大数据时,最好将数据保存在具有到期日期的会话变量中,您可以控制查看状态的副作用

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

2) viewstate存储在表单上的隐藏标记中。当用户发起回发(例如,通过单击按钮)时,数据将作为表单数据的一部分返回到服务器。这会让事情变慢

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

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

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

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


3) 您可以使缓存项特定于一个用户,或者基于其键使其全局化,使用DataTable也可以。然而,DataTable基本上是一个动态对象,视图中的代码往往难以调试

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


这将使代码更具可读性,因为现在任何程序员都可以看到您试图检索的数据。而且它将避免您不得不大量调试视图。

第一件事:除了解释之外,它仍然在很大程度上取决于您的需求、环境设置

viewstate存储在一个隐藏字段中,该字段在发送到浏览器的最终HTML中呈现为
标记。当用户发起回发(按钮单击等)时,数据将作为提交的表单数据的一部分发送回服务器

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

此外,ViewState很容易丢失。仅当用户提交表单时,才会保留该表单。如果用户单击指向其他页面的超链接,则表单不会提交,因此ViewState中包含的数据将丢失

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

如果考虑安全选项,VIEWSTATE数据在Base64中进行编码,这可以很容易地解码。这是一个典型的黑客网站的例子,所以交叉检查你到底在存储什么数据。尽管您可以通过将

EnableViewStateMac
设置为true来克服此问题

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

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


最后一个选项是使用缓存。检查视图状态是否是将数据表存储在视图状态的好方法

将数据表存储到viewstate中 DataTable dt=新的DataTable(); 视图状态[“dttable”]=dt

现在将状态数据查看到Datatable中


DataTable dtnin=(DataTable)视图状态[“dttable”]

所以会话和缓存是最好的方法?我更相信缓存,因为DataTable包含通常用于站点范围数据的数据,如GridView中的数据。会话主要用于用户特定的数据。若您必须以用户为基础存储数据表,那个么会话无疑是一种不错的方式。那个么使用会话呢?会话是否优于viewstate?会话变量将为每个不同的用户使用不同的会话变量。通常,会话上可以存储大量数据,但是具有大量流量的网站通常不会使用此方法,因为这会给服务器内存带来严重负载。