以下是我的设置的基础知识:
我有一个继承自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时,值会在帖子后面保持不变。我猜即使添加的视图状态值在整个初始页面生命周期中仍然存在,它们会在帖子中被放弃吗?
答案 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对象,以确保实际设置值。