asp.net 将DataTable分配给ViewState是持久化数据的好方法吗?

lymnna71  于 2023-10-21  发布在  .NET
关注(0)|答案(5)|浏览(210)

我从一个数据库中获取一个DataTable,并像下面这样分配给ViewState,因为我不想每次都访问我的数据库,只是想检查DataTable以进行后续查找。

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

GetDataTable()是从数据库中检索1000条记录的方法。
这是最好的方法,还是有更好的方法来解决这个问题?

gkn4icbw

gkn4icbw1#

有几种选择。哪一个是最好的使用在很大程度上取决于您的要求,环境设置等。

Viewstate:

视图状态存储在一个隐藏字段中,在发送到浏览器的最终HTML中呈现为<input />标记。当用户发起回发(通过单击按钮等)时,数据将作为提交的表单数据的一部分发送回服务器。
如果你在ViewState中存储了大量的数据,当用户试图下载页面时,你将不得不受到惩罚,因为所有的数据都将是HTML的一部分,当用户试图提交表单时,因为这些数据将再次被发送回服务器。
此外,ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一页的超链接,则不会提交表单,因此ViewState中包含的数据将丢失。
如果数据相对较小,建议使用ViewState。
如果我们考虑安全选项,ViewState数据是以base64编码的,可以很容易地解码。这是一个典型的黑客攻击网站的例子,所以仔细检查你到底存储了什么数据。您可以通过将EnableViewStateMac设置为true来解决此问题。

Session

  • 对于大量数据 *,会话是一个很好的选择。如果您能够检测到任何用户何时完成了特定的数据块,请将Session变量设置为null,以解决内存开销问题。如果你不能总是这样做,会话也将过期,内存将被自动回收。降低会话超时也会有所帮助,但要注意将其设置为干扰正常网站使用的值。

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

缓存

最后一个选择是使用缓存。查看Steven A.史密斯更多信息

6fe3ivhb

6fe3ivhb2#

副作用
1)它被序列化为输入值,并在返回时被重新序列化。
2)视图状态存储在窗体上的隐藏标记中。当用户启动回发时(例如,通过单击按钮),数据将作为表单数据的一部分返回到服务器。可能会拖慢进度。
3)ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一个页面的超链接,则永远不会提交表单,并且ViewState中包含的所有数据都将丢失。即使锚标记指向用户当前所在的页面,也是如此。
我会使用ASP.NET缓存来存储这些数据表,原因如下。
1)缓存具有到期时间,这意味着您可以根据滑动或绝对到期时间值自动删除它
2)如果进程内存“压力”太高,缓存将被自动删除。
3)可以使缓存项特定于一个用户,也可以根据其键使其对所有用户都是全局的

gcxthw6b

gcxthw6b3#

ViewState不是一个坏的方法,但是当数据量很大时,最好将数据保存在一个可以控制到期日期的Session变量中

zphenhs4

zphenhs44#

使用DataTable可以工作。然而,DataTable基本上是一个动态对象,视图中的代码往往很难调试。
我建议创建一个类或结构来保存你需要的属性,然后将DataTable转换为该类的列表示例,并将其发送到视图。
这将使代码更具可读性,因为现在任何程序员都可以看到您试图检索的数据。它将防止您不得不对视图进行大量调试。

0ejtzxu1

0ejtzxu15#

视图状态是在视图状态中存储数据表的好方法
将数据表存储到视图状态

DataTable dt=new DataTable();
ViewState["dttable"]=dt;

现在ViewState数据进入Datatable

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

相关问题