5

我正在阅读微软关于状态管理的这篇文章。

http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx

我在这里发现了一件有趣的事情。ViewState 被归类为客户端选项(尽管我已经知道了)。它让我想起了我们在应用程序中的代码。

DataTable dt = getDatatableFromDB();
ViewState["dataTable"] = dt;

这段代码目前运行良好。

我的困惑是:

  1. 客户端对象(ViewState)如何保存服务器端对象(数据表)?
  2. 使用 ViewState 存储像 Datatables 这样的大对象是一种好习惯吗?
  3. 如果我们继续使用这种方法,可能会产生什么副作用(如果有的话)?
4

2 回答 2

8

视图状态存储在<input />表单上的隐藏标记中。当用户启动回发(例如,通过单击按钮)时,数据将作为表单数据的一部分返回到服务器。

如果您在 ViewState 中存储大量数据,那么当用户尝试下载页面(因为所有这些数据都将成为 HTML 的一部分)和用户尝试提交表单时(因为所有这些数据必须上传回服务器)。

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

我从您之前的问题中看到,您正试图找到一个放置数据表的好地方。ViewState 不是最差的地方,只要数据比较少。Base64 在内存使用方面优于 XML,但距离高效还有很长的路要走。如果数据是相当静态的,您可能需要考虑将其存储在ApplicationState中。如果您正在使用 GridView 编辑 DataTable,那么 GridView 实际上已经为您存储了 DataTable,您可以通过DataSource属性访问它(只需将其转换回 DataTable)。


还值得注意的是,虽然 ViewState 数据是用 base64 编码的(这意味着普通用户将无法理解它),但确定的用户可以轻松地对其进行编辑。看似无害的数据可能会被编辑为对您的网站非常有害。这是入侵网站的经典途径,因此您必须非常小心您存储的数据究竟是什么。例如,如果您将用户的 ID 存储在 ViewState 中,则用户可以编辑 ID 并侵入另一个用户的帐户。(注意:仅当 EnableViewStateMac 设置为时才会出现问题False

于 2012-10-11T04:28:19.647 回答
4

1)客户端对象(ViewState)如何保存服务器端对象(Datatable)?

它是序列化的。

2) 使用 ViewState 存储像 Datatables 这样的大对象是一种好习惯吗?

这取决于您的环境和要求。

3)如果我们继续使用这种方法,可能会产生什么副作用(如果有的话)?

大量数据将通过网络传输。它可能会减慢速度。

于 2012-10-11T04:30:05.157 回答