Laden...

Statische Objekte in Page_Load Methode sind null.

Erstellt von Michael Schuler vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.496 Views
M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 13 Jahren
Statische Objekte in Page_Load Methode sind null.

Hallo zusammen

Eigentlich bin ich ja kein Web-Anfänger, aber diese Woche fühle ich mich wirklich wie einer. Warum? In der Page_Load Funktion sind meine Objekte (statische, keine dynamischen) null. Und daher erhalte ich logischerweise eine NullReferenceException.

Zuerst einmal der Code:
Default.aspx


...
<div id="content">
	<cms:NewPageController ID="myNewPageController" runat="server" />
	<cms:Login ID="myLoginController" runat="server" />
</div>
...

NewPageController.ascx


<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NewPageController.ascx.cs" Inherits="Cms.Web.Admin.Pages.NewPageController" %>

<cms:NewPageDetailForm ID="myNewPageDetailForm" runat="server" />
<cms:NewPageParentChooser ID="myNewPageParentChooser" runat="server" />
<cms:NewPageFieldChooser ID="myNewPageFieldChooser" runat="server" />

NewPageController.ascx.cs


protected void Page_Load(object sender, EventArgs e)
{
	myNewPageDetailForm.Controller = this;
	myNewPageFieldChooser.Controller = this;
	myNewPageParentChooser.Controller = this;

	GoToNextStep();
}

Alle Controls sind in den jeweiligen *.ascx.designer.cs deklariert und in den *.ascx files eingebunden. Sind also statische Controls. Mein Verständnis von ASP.NET ist eigentlich, dass diese Controls während des Lifecycle erstellt werden. Bei mir scheint dies aber nun nicht der Fall zu sein - an was könnte das liegen?
Die Exception taucht in der Klasse NewPageController in der Methode Page_Load in der ersten Zeilte auf.

Danke für die Hilfe,
LG Michi

K
14 Beiträge seit 2010
vor 13 Jahren
he

ich bin auch kein profi aber ich denke das liegt am pagelifecycle:

von msdn: http://msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events

The Page object calls the OnLoad method on the Page object, and then recursively does the same for each child control until the page and all controls are loaded. The Load event of individual controls occurs after the Load event of the page.

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 13 Jahren

Gemäss Pagelifecycle werden die Controls aber zwischen PreInit und Init erstellt.

Raised after all controls have been initialized and any skin settings have been applied.

Meiner Meinung nach stimmt der Code, könnte das Projekt irgendwie kaputt sein? Ich deploye übrigens nicht via IIS, sondern via VS-integrierten Server.

5.941 Beiträge seit 2005
vor 13 Jahren

Salute Michael

Extrahiere mal das notwendige für eine Nachvollziehbarkeit.
Dann machst du ein neues Projekt und baust das Notwendige ein.

Tritt dort der selbe Fehler auf?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 13 Jahren

Hallo Peter

Ich habe mal alles in ein Testprojekt extrahiert - und ja, der Fehler tritt immer noch auf. Das Testprojekt habe ich angehängt. Ist ein VS2008 Projekt.
Der Aufruf ist: http://localhost:51139/Admin/NewPage.aspx
Die Logging-Komponente habe ich auch abgehängt, der Fehler tritt aber im NewPageController in der Methode Page_Load auf.

LG Michi

5.941 Beiträge seit 2005
vor 13 Jahren

Salute Michael

Ich habe mir das Projekt mal "kurz" angeguckt.

  • Url Rewriting oder nicht, macht keinen Unterschied
  • Controls sind m.E. korrekt registriert
  • Default.aspx passt
  • Das Control auf den ersten Blick auch. Jedoch tritt genau in dem Control dasselbe auch mit <asp:TextBox ID="test" runat="server" /> auf

So gesehen würde ich den Fehler auf das Control eingrenzen, erstmal.
Und allgemein: Alles unnötige, potentielle Fehlerquellen entfernen. Aber ohne Url Rewriting gibts nicht mehr wirklich viel......

Ich hoffe das hilft dir ein wenig weiter. Berichte dann.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 13 Jahren

Hallo Peter

In der Web.config habe ich nun folgende Einträge entfernt:


<system.web>
	<pages>
		<controls>
			<add tagPrefix="cms" namespace="Cms.Web.Admin" assembly="Cms.Web"/>
			<add tagPrefix="cms" namespace="Cms.Web.Admin.Pages" assembly="Cms.Web"/>
			<add tagPrefix="cms" namespace="Cms.Web.Admin.Templates" assembly="Cms.Web"/>
		</controls>
	</pages>
</system.web>

Nun registriere ich die Controls auf jeder Page von Hand. So funktioniert es. Sobald ich die Einträge im Web.config wieder hinzufüge, funktioniert es nicht mehr.

Mein Problem ist somit zwar gelöst, aber warum das so ist, verstehe ich nicht...

LG Michi

5.941 Beiträge seit 2005
vor 13 Jahren

Salute Michael

Also per Designer reingezogen, oder von Hand reingeschrieben?
Wie sieht diese Registrierung dann aus, die funktioniert?
Hast du im Verzeichnis /Admin/ noch eine andere web.config?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 13 Jahren

Guten Morgen Peter

Im File NewPageController.ascx habe ich folgende Einträge von Hand gemacht:

<%@ Register TagPrefix="cms" TagName="NewPageDetailForm" Src="~/Admin/Pages/NewPageDetailForm.ascx" %>
<%@ Register TagPrefix="cms" TagName="NewPageParentChooser" Src="~/Admin/Pages/NewPageParentChooser.ascx" %>
<%@ Register TagPrefix="cms" TagName="NewPageFieldChooser" Src="~/Admin/Pages/NewPageFieldChooser.ascx" %>

Eine andere Web.config habe ich nicht. Im original-Web.config hatte ich die Einträge auch von Hand gemacht gehabt, aber die haben ja eben nicht funktioniert. Für mich hört sich das irgendwie nach Bug an. Evtl. hat es auch damit zu tun, dass die Einträge im Web.config alle den gleichen Tag-Prefix hatten.

LG Michi

5.941 Beiträge seit 2005
vor 13 Jahren

Hoi Michael

Die web.config Einträge sind auf den gesamten Namespace in der genannten Assembly gültig, also für mehrere Controls darin.

Die letzten geposteten, mit denen es funktioniert sind jeweils explizit auf ein Control.
Sieht also eher nach einem Namespace-Konflikt / Namen-Konflikt aus.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011