2009-07-23 5 views
0

Ich erstelle Seiten dynamisch mit einer Datenbank zum Speichern der Seiteninformationen und .NET (C#) zum Erstellen von Seiten. Ein Teil dieses Prozesses besteht darin, die Masterpage (im Code-Behind) auf der Grundlage dessen zu setzen, was in der Datenbank enthalten ist, und das, wie ich es verstehe, in Page_PreInit zu tun.Übergabe von Objekten/Variablen zwischen Page_PreInit und Page_Load

Mein Problem ist, wie Objekte und Variablen von an Page_Load übergeben werden.

ich in der Lage gewesen, um es wie folgt funktioniert, aber zufällige Compilierung Fehler habe bei dieser Methode:

public partial class BuildPage : System.Web.UI.Page 
{ 
    protected static string pageData; 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     --- SET pageData = DATA FROM DATABASE, AND SET MASTERPAGE --- 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     --- USE pageData TO BUILD AND DISPLAY THE REST OF THE PAGE --- 
    } 
} 

Aus verschiedenen Gründen, ich bin nicht Visual Studio zu kompilieren die Seite verwenden, Nur lassen Sie .NET bei der Anfrage der ersten Seite spontan kompilieren. Ich habe zwei Fehlermeldungen bekommen:

1) „CS0102: Der Typ‚BuildPage‘bereits eine Definition enthält für‚Pagedata‘“

2) „ASPNET: Stellen Sie sicher, dass die Klasse in dieser Code-Datei Streichhölzer definiert Das 'erbt' Attribut und es erweitert die korrekte Basisklasse (zB Page oder UserControl). "

Das Merkwürdige ist, dass manchmal die Seite kompiliert auf der ersten Web-Anfrage. Und für jene Zeiten, die es nicht nach der ersten Anforderung nach einer zufälligen Anzahl von Seitenaktualisierungen tut, wird es perfekt kompilieren. Nach dem Kompilieren scheint alles in Ordnung zu sein, bis ich eine andere Änderung am Code vorgenommen habe und neu kompilieren muss.

Ich scheinen nur diese Kompilierungsfehler zu erhalten, wenn Sie diese Methode verwenden, um Variablen zwischen Page_PreInit und Page_Load zu teilen. Mit anderen Worten, wenn ich die Daten einfach zweimal von der Datenbank anfordere, einmal in "Page_PreInit" und einmal in "Page_Load", bekomme ich diese Fehler nie. Aber ich möchte die Datenbanklast lieber nicht verdoppeln.

Also meine Frage hat wirklich zwei Teile, erstens, ist das eine akzeptable Möglichkeit, Variablen zu teilen, oder gibt es eine bessere Möglichkeit, Daten von Page_PreInit zu Page_Load zu übergeben?

Und zweitens, wenn das ein akzeptabler Weg ist, sind die Fehler unabhängig und hat jemand ähnliche Fehler gesehen, die einfach nach wiederholten Web-Anfragen weggehen?

Danke für jede Hilfe! Futter

+0

Testen Sie immer mit den gleichen Daten? I.e. könnte es sein, dass die pageData manchmal null ist, wenn Sie im PageLoad darauf zugreifen, weil etwas in der Datenbank fehlte? – Don

+0

Vielen Dank für Ihre Hilfe, Sie alle hatten solide Antworten, es war der "statische" Modifikator, der das Problem war. StackOverflow.Com ist erstaunlich. –

Antwort

0

Die Verwendung eines geschützten (oder privaten) Members ist definitiv die richtige Methode, um Objekte zwischen Methoden in einer Klasse zu teilen. Ihr Mitglied sollte jedoch nichtstatic sein. Static bedeutet, dass es eine einzelne Instanz über mehrere Threads gibt. Jede Kopie der Seite, die für die verschiedenen Anfragen ausgeführt wird, die auf diese Seite zugreifen, konkurriert um das Lesen/Schreiben dieses Mitglieds.

Auch Ihre Klasse ist mit "teilweise" gekennzeichnet. Das bedeutet, dass ein anderes Klassenfragment in einer anderen Datei vorhanden sein könnte, das zusätzliche Member und Methoden für die gleiche BuildPage Klasse enthält. Wenn Sie in beiden dasselbe pageData-Mitglied deklarieren, werden sie in Konflikt geraten.

+0

Ah, vielen Dank, der "statische" Modifikator war genau das Problem. Ich bin mir ziemlich sicher, dass "teilweise" Klasse korrekt ist (http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx), aber ich werde definitiv mehr Untersuchungen dazu machen auch. Danke für die schnelle und vollständige Antwort! –

+0

@ futter großartig! Um es klar zu sagen - es gibt nichts, was mit "partiell" falsch ist - es ist nur etwas zu beachten, dass, wenn etwas als "partiell" markiert ist, * eine doppelte Mitgliedererklärung an anderer Stelle sein kann. –

0

Wahrscheinlich möchten Sie nicht, dass die Elementvariable statisch ist. Es kann zu seltsamen Ergebnissen führen, wenn mehr als eine Person gleichzeitig auf die Seite zugreift.
Es könnte auch die direkte Ursache für Ihr Problem sein, wegen der Art, wie Vorlagen funktionieren, obwohl ich mir nicht sicher bin.

0

Haben Sie in Ihren Codebehinds mehrere Seiten mit der als BuildPage angegebenen Klasse? Sie sollten für jede Seite eindeutig sein und in der Seitenanweisung der zugehörigen ASPX-Datei ordnungsgemäß referenziert werden. Ich denke, der CS0102-Fehler liegt daran, dass Sie zwei Teilklassen mit demselben Namen haben, die beide einen statischen Wert definieren. Wenn Sie also die beiden Teiltöne kombinieren, versuchen Sie, die statische Komponente zweimal in der kombinierten Klasse zu definieren. Wenn Sie Ihre Klassennamen/Seitenanweisungen aussortieren, sollte das den zweiten Fehler ebenfalls lösen.

Zweitens gibt es keinen Grund dafür, dass die Variable pageData statisch ist. Sie können den Wert festlegen und darauf zugreifen, ohne dass er statisch ist.

0

Statisch ist nicht das, was Sie wollen - das wird von allen Instanzen der Seite geteilt. Wenn also zwei Clients dieselbe Seite laden, würde die zweite die erste schreiben, mit der Möglichkeit, dies zwischen der init zu tun und Last des ersten.

Sie könnten den HttpContext für die Seite verwenden, um Daten umzuleiten, es durchläuft alle Ereignisse.