Ich weiß nicht viel über ASP.Net, aber ich versuche ein neues Steuerelement für eine Nachrichtenbox zu erstellen. Sie geben einige Informationen ein und drücken eine Taste.
Aus irgendeinem seltsamen Grund, wenn die Schaltfläche gedrückt wird, wird Page_Load () ein zweites Mal aufgerufen, und alle Mitgliedsvariablen werden auf null zurückgesetzt! Ich brauche diese Variablen, und Page_Load () hat keinen Grund, ein zweites Mal aufgerufen zu werden! Natürlich ist der Callstack nutzlos.
Denken Sie daran, dass Sie in ASP.Net jedes Mal, wenn Sie ein Postback irgendeiner Art verursachen, einschließlich der Behandlung von Ereignissen wie Schaltflächenklicks, mit einer brandneuen Instanz Ihrer Seitenklasse arbeiten, die von Grund auf neu erstellt werden muss. Alle Arbeiten, die Sie zuvor zum Erstellen der Seite auf dem Server ausgeführt haben, sind weg . Das bedeutet, dass Sie den Seitenlebenszyklus gesamter einschließlich Ihres Seitenladecodes und nicht nur den Klickcode ausführen müssen.
Immer zwei gibt es, nicht mehr und nicht weniger. Eine Anfrage und eine Antwort.
Wenn die Seite zurückschlägt, wird die Page_Load-Methode aufgerufen. Sobald der Server die Seite tatsächlich verarbeitet und Ihnen basierend auf den Änderungen eine neue sendet, wird Page_Load erneut aufgerufen, und zwar das erste Mal auf der neuen Seite, die an Sie gesendet wurde.
Wenn Sie also Daten im Page_Load -Ereignis abrufen oder einige Werte festlegen, schließen Sie sie im folgenden Block ein:
%Vor%um etwas von deinem Zustand zu bewahren. Andernfalls werden die Anweisungen, die Sie in das Page_Load-Ereignis einfügen, jedes Mal ausgeführt.
Es hilft, den Lebenszyklus der ASP.Net-Seite zu überprüfen:)
Wie von Joel erwähnt, gehen Instanzvariablen verloren, sobald die Seite an den Client zurückgesendet wird. Es gibt jedoch verschiedene Methoden zum Speichern der Werte Ihrer Variablen, damit Sie sie später abrufen können. Diese Seite auf Statusverwaltung ist ein guter Ausgangspunkt, wenn Sie mehr erfahren möchten.
>Für mich war das Problem ein wenig kompliziert, aber ich fand das
protected override void OnPreRender(EventArgs e)
-Handler wird nur einmal aufgerufen, daher ist es sicherer, einige Aktionen dort einzutragen, wenn es für Sie nicht zu spät ist.
Eine Erweiterung der @ user3207728 Antwort, ich fand diesen Link erklärt es gut und hat eine einfache Lösung ...
Leider ist die Überprüfung nur für if (!Page.IsPostBack)
nicht genug, da IsPostBack
bei einer Aktualisierung immer FALSE ist.
Sie können Sitzungen oder Viewstate verwenden, um die Werte von Variablen beizubehalten.