为什么我的 UserControl 的 ViewState 只保存了一部分?

Why is my UserControl's ViewState partially saved?

我有一个大量使用 this.ViewState["Key"] = SomeValue 的用户控件。其中大部分是从我的 Page_Init():

加载的
protected void Page_Init(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
         ViewState["Blahblah"] = LoadSomeValue();
    }
}

其余的设置在不同的点。

但由于某种原因,它在后续回发中不可用。我覆盖了 SaveViewState() 来检查,只保存了三个!

protected override object SaveViewState()
{
    List<object> viewStateObjectsBefore = ViewState.OfType<object>().ToList();

    object ret = base.SaveViewState();

    List<object> viewStateObjectsAfter = ViewState.OfType<object>().ToList();
    GC.KeepAlive(viewStateObjectsBefore);
    GC.KeepAlive(viewStateObjectsAfter);
    GC.KeepAlive(ret);
    return ret;
}

viewStateObjectsBeforeviewStateObjectsAfter都包含10对key/value,但ret只包含三对!

添加: 将初始化移动到 Page_Load() 不是一个容易获得的选项,因为初始化必须在父 Page_Load() 执行之前完成。

在我的 Page_Init() 末尾添加对 SetDirty() 的调用解决了问题:

protected void Page_Init(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        ViewState["Blahblah"] = LoadSomeValue();

        //Looks like the ViewState is not yet "tracking" changes before Page_Load.
        //The items have to be marked as "dirty" manually so they'll be included by SaveViewState().
        ViewState.SetDirty(true);
    }
}