我从一个数据库中获取一个DataTable,并像下面这样分配给ViewState,因为我不想每次都访问我的数据库,只是想检查DataTable以进行后续查找。
DataTable dt = GetDataTable(); ViewState["dtTable"] = dt;
GetDataTable()是从数据库中检索1000条记录的方法。这是最好的方法,还是有更好的方法来解决这个问题?
GetDataTable()
gkn4icbw1#
有几种选择。哪一个是最好的使用在很大程度上取决于您的要求,环境设置等。
视图状态存储在一个隐藏字段中,在发送到浏览器的最终HTML中呈现为<input />标记。当用户发起回发(通过单击按钮等)时,数据将作为提交的表单数据的一部分发送回服务器。如果你在ViewState中存储了大量的数据,当用户试图下载页面时,你将不得不受到惩罚,因为所有的数据都将是HTML的一部分,当用户试图提交表单时,因为这些数据将再次被发送回服务器。此外,ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一页的超链接,则不会提交表单,因此ViewState中包含的数据将丢失。如果数据相对较小,建议使用ViewState。如果我们考虑安全选项,ViewState数据是以base64编码的,可以很容易地解码。这是一个典型的黑客攻击网站的例子,所以仔细检查你到底存储了什么数据。您可以通过将EnableViewStateMac设置为true来解决此问题。
<input />
EnableViewStateMac
此外,会话中的数据实际上在页面加载之间存在于Web服务器上。这有助于保持页面大小较小;它只需要使用会话ID。
最后一个选择是使用缓存。查看Steven A.史密斯更多信息
6fe3ivhb2#
副作用1)它被序列化为输入值,并在返回时被重新序列化。2)视图状态存储在窗体上的隐藏标记中。当用户启动回发时(例如,通过单击按钮),数据将作为表单数据的一部分返回到服务器。可能会拖慢进度。3)ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一个页面的超链接,则永远不会提交表单,并且ViewState中包含的所有数据都将丢失。即使锚标记指向用户当前所在的页面,也是如此。我会使用ASP.NET缓存来存储这些数据表,原因如下。1)缓存具有到期时间,这意味着您可以根据滑动或绝对到期时间值自动删除它2)如果进程内存“压力”太高,缓存将被自动删除。3)可以使缓存项特定于一个用户,也可以根据其键使其对所有用户都是全局的
gcxthw6b3#
ViewState不是一个坏的方法,但是当数据量很大时,最好将数据保存在一个可以控制到期日期的Session变量中
zphenhs44#
使用DataTable可以工作。然而,DataTable基本上是一个动态对象,视图中的代码往往很难调试。我建议创建一个类或结构来保存你需要的属性,然后将DataTable转换为该类的列表示例,并将其发送到视图。这将使代码更具可读性,因为现在任何程序员都可以看到您试图检索的数据。它将防止您不得不对视图进行大量调试。
0ejtzxu15#
视图状态是在视图状态中存储数据表的好方法将数据表存储到视图状态
DataTable dt=new DataTable(); ViewState["dttable"]=dt;
现在ViewState数据进入Datatable
DataTable dtnin=(DataTable)ViewState["dttable"];
5条答案
按热度按时间gkn4icbw1#
有几种选择。哪一个是最好的使用在很大程度上取决于您的要求,环境设置等。
Viewstate:
视图状态存储在一个隐藏字段中,在发送到浏览器的最终HTML中呈现为
<input />
标记。当用户发起回发(通过单击按钮等)时,数据将作为提交的表单数据的一部分发送回服务器。如果你在ViewState中存储了大量的数据,当用户试图下载页面时,你将不得不受到惩罚,因为所有的数据都将是HTML的一部分,当用户试图提交表单时,因为这些数据将再次被发送回服务器。
此外,ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一页的超链接,则不会提交表单,因此ViewState中包含的数据将丢失。
如果数据相对较小,建议使用ViewState。
如果我们考虑安全选项,ViewState数据是以base64编码的,可以很容易地解码。这是一个典型的黑客攻击网站的例子,所以仔细检查你到底存储了什么数据。您可以通过将
EnableViewStateMac
设置为true来解决此问题。Session
此外,会话中的数据实际上在页面加载之间存在于Web服务器上。这有助于保持页面大小较小;它只需要使用会话ID。
缓存
最后一个选择是使用缓存。查看Steven A.史密斯更多信息
6fe3ivhb2#
副作用
1)它被序列化为输入值,并在返回时被重新序列化。
2)视图状态存储在窗体上的隐藏标记中。当用户启动回发时(例如,通过单击按钮),数据将作为表单数据的一部分返回到服务器。可能会拖慢进度。
3)ViewState很容易丢失。它仅在用户提交表单时保留。如果用户单击指向另一个页面的超链接,则永远不会提交表单,并且ViewState中包含的所有数据都将丢失。即使锚标记指向用户当前所在的页面,也是如此。
我会使用ASP.NET缓存来存储这些数据表,原因如下。
1)缓存具有到期时间,这意味着您可以根据滑动或绝对到期时间值自动删除它
2)如果进程内存“压力”太高,缓存将被自动删除。
3)可以使缓存项特定于一个用户,也可以根据其键使其对所有用户都是全局的
gcxthw6b3#
ViewState不是一个坏的方法,但是当数据量很大时,最好将数据保存在一个可以控制到期日期的Session变量中
zphenhs44#
使用DataTable可以工作。然而,DataTable基本上是一个动态对象,视图中的代码往往很难调试。
我建议创建一个类或结构来保存你需要的属性,然后将DataTable转换为该类的列表示例,并将其发送到视图。
这将使代码更具可读性,因为现在任何程序员都可以看到您试图检索的数据。它将防止您不得不对视图进行大量调试。
0ejtzxu15#
视图状态是在视图状态中存储数据表的好方法
将数据表存储到视图状态
现在ViewState数据进入Datatable