将数据表分配给视图状态是一个好方法



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

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

GetDataTable() 是一种从数据库中检索 1000 条记录的方法。这是最好的方法还是哪一种是处理这个问题的最佳方法?

首先要做的是:撇开解释不谈,它仍然在很大程度上取决于您的要求、环境设置......

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

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

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

建议使用视图状态是如果数据相对较小。

如果我们考虑安全选项,ViewState 数据以 base64 编码 ,可以轻松解码。 这是入侵网站的经典示例,因此请交叉检查您究竟存储了哪些数据。尽管您可以通过将EnableViewStateMac设置为 true 来解决此问题。

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

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

最后一个选项是使用 Caching。在此处查看 MSDN,了解有关缓存的最佳实践。

查看状态 副作用

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

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

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

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

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

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

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

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

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

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

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

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

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

现在视图状态数据到数据表中

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

最新更新