2010-07-09 98 views
1

Scratch this!Viewstate如何在内部工作

我已经搜索了我的屁股寻找这个。 1.假设我有一个带有几个文本框的网络表单,其ID为textbox1,textbox2,textbox3。他们都启用了视图状态。 我在这些文本框中放了一些值,并推送一个空的回发按钮,回传后所有的值仍然存在。如何在回发后在视图状态下访问它们? 我会认为他们被保存在文本框的ID名下,但我没有让它像这样工作。 String s = ViewState [“textbox1”]。ToString(); 我试图让这个工作,因为我想能够保存viewstate到会话,所以我可以检索信息后,我访问另一个webform。 2.是不是我只能在同一个页面上使用viewstate? 我无法使用editor.aspx中default.aspx的viewstate? 3.还有一件事,viewstate节省了treeview节点的花费是不是正确的?我想在使用相同masterpage的两个webforms之间的treeview中保存状态。


编辑:

好吧,这还不够清楚,那是理所当然的。 基本上,我试图了解viewstate和我能用它做什么。 我通常不使用viewstate来存储值。

我想要做什么,或者找出它是否可能与视图状态。

我有一个masterpage,并在masterpage上是一个treeview。我有两个页面,我使用masterpage,Default.aspx和editor.aspx。 我做我的导航和Default.aspx中的一切。当我在TreeView中展开节点并选择了一个treenode时,treenode上的导航将我发送给editor.aspx?navID = 3。 editor.aspx使用相同的母版页,并且我希望该页面在树状视图上显示SAME状态,就像Default.aspx在单击节点之前所做的那样。

+2

这是一个关于viewstate的优秀博客http://weblogs.asp.net/infinitiesloop/archive/2006/ 08/03/Truly-Understanding-Viewstate.aspx – dotjoe 2010-07-09 16:52:34

+0

你究竟在做什么? POST default.aspx的TextBox值到editor.aspx? – 2010-07-09 16:56:53

回答

1

ViewState中收集System.Web.UI.Control只允许访问视图状态袋该控件,不子控件。所以基本上你不能通过ViewState做你想做的事情。

您可以获取控件通过Request.Form参数发布的值。举例来说,如果你有一个控制呼叫TextBox1中,你可以通过

Request.Form["textbox1"] 

得到贴出的价值取决于你可能必须做你离开那里值一些处理的控制。对于树形视图,您可以使用

Request.Form[TreeView1.ClientID + "_ExpandState"] 

,该值与任何一个电子(扩)或每个节点的N(不扩展)的字符串获得其扩张状态的公布值。因此,如果值为“eennene”,节点1 2 5和7将被扩展,而其他节点将不会被扩展

+0

我可以使用这个,我会保存在会话中,并在另一个webform上再次打开。 我将如何注入一个字符串到树视图,所以它会扩大选定的字符串。基本上走另一条路..? – eski 2010-07-09 17:22:16

+0

你必须对代码后面的字符串做一些处理。可能是页面加载。在初始加载时挖掘包含展开的节点的字符串,并将节点的状态设置为展开或折叠状态。 – 2010-07-09 18:02:29

+0

好吧,如果我可以只将字符串放在树状视图中就好了,如 String nodeState =“nncceencnecne”; treeview.expandstate = nodestate; ;) 但我猜我必须通过与foreach循环的节点,并注入每个节点和每个人。 – eski 2010-07-09 21:23:52

2

你的代码无法工作的原因是因为ASP.NET使用了不同的名称(我认为它在控件名称前加上了表单名称和主页面名称,如果有的话)。但即使你可以用这种方法拉它,你也不应该这样做。您应该手动将属性添加到视图状态。所以,如果你想保存在文本框中的文本,使用下面的代码:

ViewState["TextBoxText"] = textbox1.ToString(); 

而中检索此之后,使用:

String s = (String)ViewState["TextBoxText"]; 

回答您的问题:

  1. 你说得对。视图状态对每个页面都是神圣的,不能被访问
  2. Treeview会自动保存扩展节点。只要确保你正在做一个if(!Page.IsPostBack)块内的treeview初始化。
+0

有关问题2的更多信息。我将视图状态中的treeview节点状态保存下来,我将如何恢复它们? – eski 2010-07-09 16:56:33

+0

@eski我认为你应该发布一个更具体的问题,甚至可能完全删除这个问题(或至少编辑它)来真正解决你的整体情况,我认为你有一些关于使用webforms的更大的误解,并且正在解决你的问题实际问题是错误的。 – 2010-07-09 16:59:21

+0

@eski我很确定你不需要做任何事情。树视图控件应该自动保存节点状态,而无需执行此操作。 – Icemanind 2010-07-09 17:12:36

4

看看这篇文章,了解更多关于viewstate。我发现它有助于

Truly understanding viewstate

+0

+1这是一篇很棒的文章,用于学习ViewState的真正功能。 – 2010-07-09 17:10:15