Heim > Artikel > Backend-Entwicklung > Lösung für Fehler beim Rendern von Steuerelementen in VS2010
Beim Erstellen von Steuerelementen können leicht Fehler wie „Beim Rendern des Steuerelements ist ein Fehler aufgetreten“ und „Eine nicht behandelte Ausnahme ist aufgetreten. Der Objektverweis wurde nicht auf eine Instanz des Objekts festgelegt.“ auftreten, wie unten gezeigt: (Es kann auch einfach daran liegen, dass das Objekt nicht auf eine Instanz des Objekts gesetzt ist.) Das Setzen des runat="server"-Tags verursacht diesen Fehler, bitte überprüfen Sie diesen Punkt zuerst)
Aber zur Kompilierungszeit liegt kein Fehler vor/ Laufzeit.
Analyse
Die in der Abbildung dargestellte Situation wird als „Entwurfszeit“ bezeichnet, um sie von „Kompilierungszeit“/„Laufzeit“ zu unterscheiden.
Entwurfszeit: In der ASP.NET-Umgebung verwenden wir den Webdesigner zum Bearbeiten in Visual Studio. Das direkte Verständnis liegt vor, wenn die ASPX-Seite auf „Design“ wechselt.
Kompilierungszeit: Das direkte Verständnis ist, dass beim Kompilieren die Fehler zu diesem Zeitpunkt normalerweise Fehler sind, die durch Typprüfung, Parameterabgleich usw. verursacht werden und direkt durch Syntaxbeschränkungen begrenzt werden können.
Laufzeit: Das direkte Verständnis erfolgt, wenn Sie eine Vorschau anzeigen/ausführen. Normalerweise bestehen die Fehler zu diesem Zeitpunkt aus spezifischen Ausnahmen und logischen Fehlern.
Lassen Sie uns die Leistung des Steuerelements während des Entwurfs analysieren. VS simuliert auf intelligente Weise das Erscheinungsbild des Ausgabesteuerelements zur Laufzeit. Die Darstellung des Steuerelements durchläuft schließlich die aktuelle Ausgabe . Gemäß dem Standard sollten wir die Ausgabeoperation für das Steuerelement in Render oder RenderContents durchführen (tatsächlich sind auch andere möglich, aber wir machen das normalerweise nicht, oder mehr „Fehler beim Rendern der Steuerung“-Ausnahmen kommen hauptsächlich von Render oder RenderContents ).
Aus der Fehlermeldung „Der Objektverweis ist nicht auf eine Instanz des Objekts festgelegt.“ Dies bedeutet, dass eine oder mehrere Instanzen des Objekts ohne Zuweisung eines Anfangswerts verwendet werden.
Lassen Sie uns einen Blick auf unseren Code werfen:
protected override void RenderContents(HtmlTextWriter writer) { UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); DownButton.Text = Page.Server.HtmlDecode(DownButton.Text); base.RenderContents(writer); }
Da das Steuerelement beim Entwerfen eine Aufwärts- und eine Abwärts-Taste haben muss, werden dort jeweils zwei Schaltflächen benötigt sind spezielle Satzzeichen nach oben und unten, und diese beiden Symbole müssen vom Browser korrekt gerendert werden, indem die Codenummern wie unten gezeigt festgelegt werden:
private string upButtonText = "∧"; private string downButtonText = "∨";
Und diese beiden Symbole werden vor dem Rendern angezeigt. Es wird jedoch so sein Durch eine HtmlEncode-Methode auf der Seite kompiliert und dann ausgegeben. Diese beiden Sonderzeichen können jedoch nur durch direkte Ausgabe dargestellt werden. Das heißt, nach HtmlEncode können die Sonderzeichen nur in Form von Text ∧ ∨ ausgegeben werden und Abwärtspfeile werden nicht ausgegeben. Zu diesem Zeitpunkt müssen wir die umgekehrte Methode Page.Server.HtmlDecode zum Dekodieren einführen. Beachten Sie, dass diese Instanz nur dann ungleich Null ist, wenn die Seite tatsächlich vorhanden ist , und bei einem solchen Vorgang wird der Fehler „Objektverweis nicht auf eine Instanz des Objekts festgelegt“ angezeigt.
Entwurfszeit: Wie bereits erwähnt, simuliert die Entwurfszeit nur den Prozess des Seitenrenderings und die Seite existiert nicht tatsächlich. Daher ist die Instanz des Page-Objekts zu diesem Zeitpunkt leer und nachfolgende Aufrufe lösen eine Ausnahme aus.
Angenommen, wir haben nur diese Methode, um das aktuell erforderliche Verhalten zu verarbeiten. Wenn wir Page aufrufen, führt dies definitiv zu einem Nullobjekt und führt bei nachfolgenden Vorgängen zu Ausnahmen. Zu diesem Zeitpunkt führen wir das Konzept des „Entwurfsmodus“ ein (nicht DesignPattern, sondern DesignMode ist eine geschützte Eigenschaft der Control-Klasse, die einen Wert erhält, der angibt, ob sich die Komponente derzeit im Entwurfsmodus befindet). Das Entwurfsmuster entspricht hier dem Konzept des Designs.
Damit wir den Code in die folgende Form umwandeln können:
protected override void RenderContents(HtmlTextWriter writer) { if (!DesignMode) { UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); DownButton.Text = Page.Server.HtmlDecode(DownButton.Text); } base.RenderContents(writer); }
Auf diese Weise führen wir Instanzen des Page-Objekts nur dann ein, wenn es keine Entwurfszeit ist, also entwerfen Zeitausnahmen Es wird leicht gelöst.
Zusammenfassung
Wenn wir also ein Steuerelement entwerfen, insbesondere wenn wir die Darstellung des Steuerelements berücksichtigen, sollten wir zur Vermeidung ähnlicher Ausnahmen berücksichtigen, dass das Steuerelement genügend Ressourcen erhalten kann, z Elemente, die keine Ressourcen erhalten, sollten wir explizit unterscheiden (wie im obigen Code wird DesignMode verwendet, um zu bestimmen, ob es sich um Code handelt, der zur Entwurfszeit ausgeführt werden soll).
Erweiterung
Die Situation, die wir gerade gesehen haben, kann auf die Ausnahme zurückgeführt werden, die durch die Unfähigkeit verursacht wird, während des Entwurfs auf bestimmte Instanzen zu verweisen. Ähnliche Ausnahmen treten auch in Datenbanken auf Wenn das Dateisystem gelesen wird, ist an die Variable kein Anfangswert angehängt und es werden seitenähnliche Eigenschaften wie Session, Page.Request.QueryString usw. aufgerufen. Da einige der oben genannten Lösungen, insbesondere die für die Seite aufgerufenen zugehörigen Methoden, immer vorhanden sind, werden wir beim Entwerfen der Seite nicht oft Ausnahmen sehen. Wir sollten beim Entwerfen der Steuerelemente mehr Aufmerksamkeit schenken.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.
Weitere verwandte Artikel zu Lösungen für Fehler beim Rendern von Steuerelementen in VS2010 finden Sie auf der chinesischen PHP-Website!