2011-01-10 7 views
1

Ich habe Probleme mit einem benutzerdefinierten Steuerelement (das von einem Benutzersteuerelement erbt) - mein LoadControlState wird nicht ausgelöst.LoadControlState wird nicht ausgelöst

Nun, um genau zu sein: Es wird normal ausgelöst, aber wenn ich die Seiten LoadPageStateFromPersistenceMedium und SavePageStateToPersistenceMedium Funktionen überschreiben, wird es nicht mehr ausgelöst.

Gibt es typische Gründe dafür, dass der LoadControlState nicht ausgelöst wird, in den ich schauen sollte? Gibt es irgendwelche Vorbedingungen für, wenn es tut gefeuert wird?

Dank

Antwort

0

Der folgende Code es fest:

PageStatePersister pageStatePersister; 
    protected override PageStatePersister PageStatePersister 
    { 
     get 
     { 
      // Unlike as exemplified in the MSDN docs, we cannot simply return a new PageStatePersister 
      // every call to this property, as it causes problems 
      return pageStatePersister ?? (pageStatePersister = new SessionPageStatePersister(this)); 
     } 
    } 
0

Da .NET 2.0, ist es empfehlenswert, Ihren Zustand persistent Logik in einer benutzerdefinierten Klasse von PageStatePersister abgeleitet zu setzen. Sie können also versuchen, diesen Ansatz zu wählen.

+0

Ich habe auch versucht, dass durch Überschreiben der PageStatePersister Eigenschaft Seite und 'new SessionPageStatePersister (this);' - Dies hat das gleiche Ergebnis wie zuvor. – Chris

+1

@Chris, rufen Sie Page.RegisterRequiresControlState in OnInit Ihres benutzerdefinierten Steuerelements auf? Noch eine andere Sache, um zu überprüfen, ob die Steuer-ID geändert (oder später zugewiesen) wird. – VinayC

0

Was geben Sie von Ihrer LoadPageStateFromPersistenceMedium Methodenimplementierung zurück? Es soll wohl eine Instanz der sowohl mit dem Viewstate und Controldaten initialisiert System.Web.UI.Pair sein:

return new Pair([Restored ControlState], [Restored ViewState]); 
+0

In meinem SavePageStateToPersistenceMedium speichere ich einfach das übergebene Objekt 'viewState', das ein Paar ist (ich habe es mit Haltepunkten getestet). Und beim Laden lade ich gerade dieses Paar neu. Also nehme ich an, dass das Paar bereits der Kontroll- und Viewstatus ist? – Chris

+0

Woher bekomme ich den Steuerstatus beim Speichern? Page.ControlState existiert nicht. – Chris

+0

@Chris: base.PageStatePersister.ControlState – volpav

1

Für das, was es wert ist, hier ist, wie ich die LoadPageStateFromPersistenceMedium Funktionen Save/überschreiben bin. Im Grunde ist es speichert den Ansichtszustand in der Sitzung Benutzer, um die Postbacks schneller zu machen:

// Inspired by: http://aspalliance.com/72 
    const string ViewStateFieldName = "__VIEWSTATEKEY"; 
    const string ViewStateKeyPrefix = "ViewState_"; 
    const string RecentViewStateQueue = "ViewStateQueue"; 
    const int RecentViewStateQueueMaxLength = 5; 

    protected override object LoadPageStateFromPersistenceMedium() 
    { 
     // The cache key for this viewstate is stored in a hidden field, so grab it 
     string viewStateKey = Request.Form[ViewStateFieldName] as string; 
     if (viewStateKey == null) return null; 

     // Grab the viewstate data using the key to look it up 
     return Session[viewStateKey]; 
    } 

    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     // Give this viewstate a random key 
     string viewStateKey = ViewStateKeyPrefix + Guid.NewGuid().ToString(); 

     // Store the viewstate 
     Session[viewStateKey] = viewState; 

     // Store the viewstate's key in a hidden field, so on postback we can grab it from the cache 
     ClientScript.RegisterHiddenField(ViewStateFieldName, viewStateKey); 

     // Some tidying up: keep track of the X most recent viewstates for this user, and remove old ones 
     var recent = Session[RecentViewStateQueue] as Queue<string>; 
     if (recent == null) Session[RecentViewStateQueue] = recent = new Queue<string>(); 
     recent.Enqueue(viewStateKey); // Add this new one so it'll get removed later 
     while (recent.Count > RecentViewStateQueueMaxLength) // If we've got lots in the queue, remove the old ones 
      Session.Remove(recent.Dequeue()); 
    }