1

以下是我的设置的基础知识:

我有一个继承自 System.Web.UI.Page 的 BasePage 类。BasePage 实现了两个属性,以便它们的 get/set 从 ViewState 集合中的两个不同项目(例如来自 BasePage 的 this.ViewState["Year"])中执行。

我有另一个类,然后从 BasePage 继承,我们称之为 SpecificBasePage。

最后,我有一个继承SpecificBasePage 的aspx 页面。

我已经添加了断点并在我的代码中做了很多单步调试,发现在初始页面加载时,我的两个视图状态属性都被分配了值,并且这些值在第一个页面加载生命周期中持续存在。

但是,当页面回发时,在 Page_Load 事件和其他事件处理程序期间(应加载 ViewState 时),这两个属性都返回 null。检查 this.ViewState.Count 显示集合中有零个对象。

谁能想到我在某处可能会影响 ViewState 并导致这种行为的事情?

--另外我已经把它隔离到我的一部分代码中。在初始加载时,我在 OnInit 中给出了 viewstate 属性值,我发现当我将其移至 OnLoad 时,这些值在回帖中仍然存在。我猜即使添加的视图状态值在整个初始页面生命周期中都存在,但它们在回发中被放弃了?

4

4 回答 4

4

页面可能在 aspx 上有 EnableViewState = false

也可能在应用程序的 web.config 上被禁用,甚至在 element 上的整个计算机上也可能被禁用。

更新 1:在 asp.net 生命周期中, ViewState 在 Init 之后和 Load more info之前加载。看到它就像 init 上的任何东西都被认为是页面声明的一部分。稍后 asp.net 将加载视图状态,然后开始跟踪视图状态的更改。在此之后,asp.net 将看到视图状态的初始信息和更改的信息之间的任何差异,因此将其移动到加载可以避免问题(因为初始状态不存在,而新状态是您在视图状态上放置的任何内容) . 从上面的链接:

“原因是因为 StateBag 类仅在调用其 TrackViewState() 方法后跟踪对其成员的更改。也就是说,如果您有一个 StateBag,则在进行 TrackViewState() 之前所做的任何和所有添加或修改都不会在调用 SaveViewState() 方法时保存。TrackViewState() 方法在初始化阶段结束时调用,这发生在实例化阶段之后。因此,在实例化阶段的初始属性分配——同时写入 ViewState 中属性的设置访问器——在保存视图状态阶段的 SaveViewState() 方法调用期间不会持久化,因为尚未调用 TrackViewState() 方法。”

于 2009-03-09T17:01:28.727 回答
2

这是另一个用户发布的关于ASP.NET 页面生命周期的绝佳答案,值得一看 ViewState 问题。

另外,看看“真正了解 ViewState

于 2009-03-09T19:16:23.490 回答
0

正如我在稍后添加的部分中所述,显然您不能在页面加载之前在视图状态中设置任何内容,即使 Asp.net 不会引发错误,并且它将在整个初始页面生命周期中存在于视图状态中,它不会在后续回发的生命周期中持续存在。

于 2009-03-09T18:27:16.243 回答
0

看看您在哪里设置 ViewState 值。可能连接您的 OnUnload 事件并检查 ViewState 对象,以确保实际设置了值。

于 2009-03-09T19:13:01.720 回答