【问题标题】:Asp.net BasePage Properties using ViewState are cleared on Postback使用 ViewState 的 Asp.net BasePage 属性在回发时被清除
【发布时间】:2009-03-09 16:47:40
【问题描述】:

以下是我的设置的基础:

我有一个继承自 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 时,这些值在回帖中仍然存在。我猜即使添加的视图状态值在整个初始页面生命周期中都存在,但它们在回发中被放弃了?

【问题讨论】:

    标签: asp.net viewstate page-lifecycle


    【解决方案1】:

    页面可能在 aspx 上有 EnableViewState = false

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

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

    "原因是因为StateBag类 仅跟踪对其成员的更改 在其 TrackViewState() 方法具有 被调用。也就是说,如果你有一个 StateBag,任何和所有添加或 之前所做的修改 TrackViewState() 将不会 SaveViewState() 方法时保存 被调用。 TrackViewState() 方法在结束时调用 初始化阶段,发生 在实例化阶段之后。 因此,初始属性 实例化中的赋值 阶段——写入 ViewState 时 在属性的 set 访问器中——是 期间没有坚持 SaveViewState() 方法调用 保存视图状态阶段,因为 TrackViewState() 方法尚未 调用。”

    【讨论】:

    • 感谢您的回复。我对 EnableViewState 进行了项目范围的搜索,我有一些控件,但在此页面上没有,在 web.config 中也没有
    【解决方案2】:

    这是另一个用户发布的关于 ASP.NET page lifecycle 的绝佳答案,值得一看 ViewState 问题。

    另外,看看“Truly Understanding ViewState

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          相关资源
          最近更新 更多