Frage

Ich habe eine (abgeleitete) Menüsteuerung, der eine ziemlich große Liste von Elementen aus einer benutzerdefinierten Datenquelle anzeigt. Ich brauche Viewstate auf dem Menü zu deaktivieren, die sehr ärgerlich „wählen kann nicht deaktiviert oder nicht auswählbaren Menüpunkt“ zu vermeiden, wenn eine andere Steuerung die aktuelle Auswahl bewirkt, dass auf einem Postbacks zu ändern.

Leider, wenn Viewstate für das Menü deaktiviert ist, die Postbacks erzeugt durch das Menü werden alle Ereignisse nicht zu erhöhen. Wenn ich Viewstate aktiviert, wird das OnMenuItemClick Ereignis ausgelöst hat. Wenn ich Viewstate deaktivieren, wird OnMenuItemClick nicht erhöht. Ich bin verwirrt.

Ich brauche Viewstate off für das Menü zu verlassen, so wie kann ich umgehen Postbacks aus dem eigentlichen Menü?

An dieser Stelle ich bin Neigung in Richtung mit dem Load-Ereignisse Menü, Parsen den __EVENTTARGET, um zu sehen, ob es das Menü ist, und geht von dort aus. Dies wäre technisch das Postbackereignis verarbeiten, bevor es würde normalerweise aber das ist in Ordnung, ich denke.

Jede bessere Ideen?

War es hilfreich?

Lösung 2

Ich habe das Wesen des Problems herausgefunden. Reflektor können wir den wichtigen Teil (e) von dem niedrigen Niveau Methode sehen, dass die tatsächlichen Postbacks behandelt und dann stellt sich die Veranstaltung:

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

Wie Sie die MenuEventArgs ein MenuItem übergeben wird sehen können. Wenn man nicht in der aktuellen Sammlung Items gefunden werden kann, das die eingehenden Post-Daten übereinstimmt, dann wird das Ereignis nicht ausgelöst. Mit Viewstate deaktiviert, wird das Menü haben noch keine Artikel (würden sie Viewstate wieder aufgebaut wurden mit). So wird das Ereignis nicht ausgelöst werden.

Um dies zu umgehen, habe ich das Menü gesagt, selbst unter Verwendung der noch nicht aktualisierten Daten während Last bauen (an dieser Stelle wird es das gleiche sein, wie es am Ende der letzten Anforderung war). Dies ist im Wesentlichen das gleiche wie das Menü von Viewstate Wiederaufbau, so dass ich nicht das Gefühl, schlecht in Bezug auf die Leistung oder was auch immer. OnMenuItemClick wird dann wie erwartet gebrannt. Schließlich während PreRender sagen, dass ich das Menü noch einmal neu zu erstellen, so spiegelt es die Änderungen, die während des Postbacks Verarbeitungsteil des Lebenszyklus passiert ist.

ich viel Zeit auf dieser verschwendet, so hoffentlich diese Info jemand anderes in einer ähnlichen Situation helfen kann.

Andere Tipps

Ja, können Sie wählen, entweder verwenden Ansichtszustand ein gebundenes Steuerelement neu zu besiedeln oder Sie können es Databind vor Ereignisse ausgelöst werden (Page_Load ist in Ordnung).

Ich würde nicht unbedingt immer daran bindet neu in Page_PreRender aber, wenn nichts auf dieser Postbacks geändert hat (Änderungen irgendwo anders auf der Seite passiert), dann gibt es keinen Grund, es zu binden wieder.

Stattdessen können Sie möglicherweise nur auf bestimmte Ereignisse binden, wenn Sie es wissen, wird sich ändern müssen.

In Page_Load die Steuerung an den sitemapdata rebind und prüfen, ob IsPostBack.

if (IsPostBack) {
            Menu.DataBind();
}

für mich diese Arbeit und reduziert den Ansichtszustand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top