在Postback上清除使用ViewState的Asp.net BasePage属性

时间:2009-03-09 16:47:40

标签: asp.net viewstate page-lifecycle

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

我有一个继承自System.Web.UI.Page的BasePage类。 BasePage实现了两个属性,使得它们的get / set来自ViewState集合中的两个不同的项目(来自BasePage的ex.ViewState [“Year”]。)

我有另一个继承自BasePage的类,我们称之为SpecificBasePage。

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

我添加了断点并完成了我的代码,并且发现在初始页面加载时,我的两个视图状态属性都被赋值,并且值在整个第一页加载生命周期中保持不变。

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

任何人都可以想到我可能在某处影响ViewState并导致此行为的事情吗?

- 加法 我把它隔离到我的代码的一部分。在初始加载时,我在OnInit中给出了viewstate属性值,我发现当我将它移动到OnLoad时,值会在帖子后面保持不变。我猜即使添加的视图状态值在整个初始页面生命周期中仍然存在,它们会在帖子中被放弃吗?

4 个答案:

答案 0 :(得分:4)

页面可能在aspx

上具有EnableViewState = false

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

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

  

“原因是因为StateBag类   仅跟踪其成员的更改   在TrackViewState()方法之后   被调用。也就是说,如果你有一个   StateBag,任何和所有添加或   以前做过的修改   TrackViewState()不是   SaveViewState()方法时保存   被调用。 TrackViewState()   方法在结束时调用   初始化阶段,这发生了   在实例化阶段之后。   因此,初始财产   实例化中的分配   stage-while写入ViewState   在属性的set访问器中   期间不坚持   在SaveViewState()方法中调用   保存视图状态阶段,因为   TrackViewState()方法还没有   调用“。

答案 1 :(得分:2)

以下是其他用户发布的关于ASP.NET page lifecycle的优秀答案,值得查看ViewState问题。

另外,请查看“Truly Understanding ViewState

答案 2 :(得分:0)

正如我在后面添加的部分中所述,显然你不能在页面加载之前在视图状态中设置任何东西,即使Asp.net没有抛出错误,它将在整个初始阶段存在于视图状态页面生命周期,它不会持续在后续的后期生命周期中。

答案 3 :(得分:0)

看看你在哪里设置ViewState值。可能会对OnUnload事件进行连接并检查ViewState对象,以确保实际设置值。