将DataTable分配给ViewState是一个好方法吗?

the*_*van 4 c# asp.net viewstate datatable state-management

I'm getting a DataTable from a DataBase and assigning to ViewState like below: Because I don't want to hit the database for every time.

DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
Run Code Online (Sandbox Code Playgroud)

GetDataTable() is a method, which retrieves 1000 records from the DataBase. Is this the best way or which one is the best way to handle this?

R.C*_*R.C 7

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

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

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

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

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

如果我们考虑安全选项,ViewState数据将以base64编码,可以轻松解码.这是黑客攻击网站的典型示例,因此请交叉检查您正在存储的数据.虽然您可以通过设置EnableViewStateMac 为true 来克服此问题.

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

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

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

  • 我更相信缓存,因为DataTable包含通常用于网格范围数据的数据,如GridView.会话主要用于用户特定数据.如果你必须在用户的基础上存储DataTable,那么Session肯定是一个好方法. (2认同)