2017-03-02 43 views
0

我有一個用戶控件,使大量使用this.ViewState["Key"] = SomeValue。它大部分是從我的Page_Init()加載的:爲什麼我的UserControl的ViewState部分保存?

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鍵/值對,但只ret包含三個!

補充:移動初始化到Page_Load()是不容易得到的選項,因爲必須初始化父母的Page_Load()執行之前完成。

回答

0

我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); 
    } 
} 
相關問題