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

问题描述 投票:0回答:5

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

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

GetDataTable()
是一种从数据库中检索1000条记录的方法。

这是最好的方法还是有更好的方法来处理这个问题?

c# asp.net datatable viewstate state-management
5个回答
8
投票

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

视图状态存储在隐藏字段中,在发送到浏览器的最终 HTML 中呈现为

<input />
标记。当用户启动回发(按钮单击等)时,数据将作为提交的表单数据的一部分发送回服务器。

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

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

如果数据比较少,建议使用ViewState。

如果我们考虑安全选项,ViewState 数据以 base64 编码,可以轻松解码。这是黑客攻击网站的典型示例,因此请仔细检查您到底存储了哪些数据。尽管您可以通过将

EnableViewStateMac
设置为 true 来解决此问题。

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

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

最后一个选择是使用 Caching.Check MSDN 获取有关缓存的最佳实践。


2
投票

查看状态副作用

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

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

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

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

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

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

3)您可以根据其密钥将缓存项设为特定于一个用户,或对所有用户全局化


0
投票

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


0
投票

使用数据表就可以了。然而,DataTable 基本上是一个动态对象,视图中的代码往往难以调试。

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

这将使代码更具可读性,因为现在任何程序员都可以看到您正在尝试检索哪些数据。而且它将使您不必多次调试视图。


0
投票

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

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

现在将 ViewState 数据放入 Datatable

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

© www.soinside.com 2019 - 2024. All rights reserved.