2017-03-02 2 views
0

Ich habe eine Benutzerkontrolle, die this.ViewState["Key"] = SomeValue verwendet. Der größte Teil davon wird von meinem Page_Init() geladen:Warum ist ViewState in meinem Benutzersteuerelement teilweise gespeichert?

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

Der Rest wird an verschiedenen Punkten eingestellt.

Aber aus irgendeinem Grund ist es bei späteren Postbacks nicht verfügbar. Ich überprüfte SaveViewState(), um zu überprüfen, und nur wie drei von ihnen gespeichert werden!

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; 
} 

Sowohl viewStateObjectsBefore und viewStateObjectsAfter enthalten 10 Schlüssel/Wert-Paare, aber ret enthält nur drei!

Hinzugefügt: die Initialisierungen Page_Load() Umzug ist nicht leicht verfügbare Option, da die Initialisierungen vor dem Page_Load() ausführt der Eltern getan werden muss.

Antwort

0

einen Aufruf an SetDirty() am Ende meiner Page_Init() Hinzufügen löste das Problem:

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); 
    } 
} 
Verwandte Themen