我从数据库中获取数据表并分配给 ViewState,如下所示:因为我不想每次都访问数据库。
DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
GetDataTable()
是一种方法,它从数据库中检索 1000 条记录。这是最好的方法还是最好的方法来处理这个?
我从数据库中获取数据表并分配给 ViewState,如下所示:因为我不想每次都访问数据库。
DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
GetDataTable()
是一种方法,它从数据库中检索 1000 条记录。这是最好的方法还是最好的方法来处理这个?
首先要做的事情:除了解释,它仍然很大程度上取决于您的要求,环境设置......
视图状态存储在一个隐藏字段中,该字段呈现为 <input />
发送到浏览器的最终 HTML 中的标记。当用户发起回发(按钮单击等)时,数据将作为提交的表单数据的一部分发送回服务器。
如果您在 ViewState 中存储大量数据,则当用户尝试下载页面时,您将不得不受到惩罚,因为所有此类数据都将成为您的 HTML 的一部分,并且当用户尝试提交表单时,因为这些数据再次将被发送回服务器。
此外,ViewState 很容易丢失。只要用户提交表单,它就会被保留。如果用户单击指向另一个页面的超链接,则不会提交表单,因此 ViewState 中包含的数据会丢失。
如果数据比较少,推荐使用 ViewState。
如果我们考虑安全选项,ViewState 数据以 base64 编码,可以轻松解码。这是入侵网站的经典示例,因此请交叉检查您存储的数据究竟是什么。尽管您可以通过设置EnableViewStateMac
为 true 来解决此问题。
对于大量数据,Session 是一个不错的选择。如果您能够检测到任何用户何时完成了特定数据块,请将 Session 变量设置为 null,以抵消内存开销。您不能总是这样做,但是会话也会过期并且内存将被自动回收。降低会话超时也有助于根据需要进行设置。
此外,会话中的数据实际上在页面加载之间存在于 Web 服务器上。这有助于保持页面较小,它只需要使用会话 ID。
最后一个选项是使用缓存。在此处查看 MSDN 以了解有关缓存的最佳实践。
查看状态副作用
1)它被序列化为输入值并在返回的路上反序列化。
2)视图状态存储在表单上的隐藏标签中。当用户启动回发(例如,通过单击按钮)时,数据将作为表单数据的一部分返回到服务器。它可能会减慢速度。
3)ViewState 很容易丢失。只要用户提交表单,它就会被保留。如果用户单击指向另一个页面的超链接,则永远不会提交表单,并且 ViewState 中包含的所有数据都将丢失。即使锚标记指向用户当前所在的页面也是如此。
出于以下原因,我将使用ASP.NET 缓存来存储这些数据表。
1)缓存有一个过期时间,这意味着您可以根据滑动或绝对过期时间值自动删除它
2)如果进程内存“压力”太高,缓存将自动删除。
3)您可以使缓存项特定于一个用户,或根据其键对所有用户全局
使用 DataTable 会起作用。然而,DataTable 基本上是一个动态对象,视图中的代码往往难以调试。
我建议创建一个包含所需属性的类或结构。然后将 DataTable 转换为此类的列表实例,并将其发送到视图。
这将使代码更具可读性,因为现在任何程序员都可以看到您要检索的数据。而且它会阻止你对视图进行大量调试。
ViewState 不是一个坏方法,但是当处理大数据时,最好将数据保存在具有可以控制到期日期的 Session 变量中
视图状态是在视图状态中存储数据表的好方法
将数据表存入viewstate DataTable dt=new DataTable(); 视图状态["dttable"]=dt;
现在将 ViewState 数据放入 Datatable
DataTable dtnin=(DataTable)ViewState["dttable"];