[ASP.NET] Masterpage load event / content page load event

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Beste tweakers,

Tijdens mijn project ben ik dit al wat vaker tegengekomen en ik wil dit eigenlijk nu eens resoluut gaan oplossen.

Probleem
Ik krijg regelmatig foutmeldingen dat hij bepaalde variabelen in mijn sessie null zijn. Mijn sessie is dus verlopen. Echter probeer ik dit af te vangen dat hij eventueel wanneer de sessie verloopt de gebruiker terugstuurt naar de inlogpagina of wat dan ook..

Oorzaak
De reden waarom dit niet goed gaat is dat de page_load event in mijn content page eerder wordt aangeroepen dan de page_load event in mijn master page. Dus hij probeert eerst de sessie te benaderen en daarna controleert hij pas of die sessie aanwezig is.

Oplossing
Ja en daar kom ik dus niet goed uit, ik probeerde eerst een init method in de master page aan te maken. Maar dat negeert hij gewoon. Maar hoe kan ik dit oplossen? Ik wil dus gewoon een methode in de master page die wordt aangeroepen voor de page_load event van de content page.

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

De page_init gaat wel eerst op je masterpage. Een master page is eigenlijk een child van je pagina, niet andersom.

Zie ook: http://www.odetocode.com/articles/450.aspx

Je kan ook de page_load van je content een functie van de master aan laten roepen. De master page is gewoon een control in je pagina, waar je functionaliteit van aan kan roepen.

[ Voor 34% gewijzigd door Zoijar op 04-06-2009 10:35 ]


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Je bedoelt dus dit in de masterpage?

C#:
1
2
3
protected void page_init(Object sender, EventArguments e){
 // code die voor content page aangeroepen moet worden
}



Ja ik moet nog steeds erg wennen aan die denkwijze, ik ben immers andersom gewend

Wat ik trouwens ook nog geprobeerd heb en misschien wel een beetje mijn voorkeur heeft is het volgende:
Alle contentpagina's erven van mijn class defaultMemberPage en in de constructor van die class die sessie check doen.

Maar dan krijg ik een foutmelding als :
code:
1
De sessiestatus kan alleen worden gebruikt wanneer enableSessionState is ingesteld op true, in een configuratiebestand of in de instructie Page. Controleer tevens of System.Web.SessionStateModule of een aangepaste module voor sessiestatus is opgenomen in de sectie <configuration>\<system.web>\<httpModules> in de toepassingsconfiguratie.

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ik ben nog wat verder op onderzoek uit gegaan

Ik vermoed dat de constructor van mijn class waarvan al mijn pagina's erven, eerder wordt aangeroepen dan sessie gereed is voor gebruik?

Ik zou het namelijk graag zo oplossen, dan in de masterpage. Vooral omdat de master dus een child is van en ik eerst dacht dat het anderom was.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt geen sessie-related dingen doen in de constructor van de page. Daarom hebben zowel HttpApplication, de (master) page en control ook een Init methode. Op het moment dat de page wordt gecreert, heeft asp.ent de sessie nog niet opgebouwd. Nadat de constructor van de page is aangeroepen, wordt de Master property van de page uitgelezen en wordt een instantie van de master page aan je page gekoppeld en nog tal van andere zaken geregeld. Je moet niet vergeten dat asp.net een hoop voor je doet, maar dat kan natuurlijk alleen maar gebeuren nadat de gewenste objecten zijn aangemaakt.

Het is dus heel erg belangrijk dat je je echt houd aan de events van de asp.net classes.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 20-09 17:48

Peetman

Tjah....

BlackHawkDesign schreef op vrijdag 05 juni 2009 @ 09:30:
Ik ben nog wat verder op onderzoek uit gegaan

Ik vermoed dat de constructor van mijn class waarvan al mijn pagina's erven, eerder wordt aangeroepen dan sessie gereed is voor gebruik?

Ik zou het namelijk graag zo oplossen, dan in de masterpage. Vooral omdat de master dus een child is van en ik eerst dacht dat het anderom was.
Kan je niet beter al je pagina's laten overerven van een base Page class? Dan zet je daar in de onload alles wat je nodig hebt en in de OnLoad van de pagina's zet je dan eerst een base.OnLoad().

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
@Peetman: Ik wil dus niet steeds in elke pagina een functie hoeven aan te roepen. Dit moet automagisch gaan! Simpel omdat als iets niet goed is met die functie, ik dit als nog op alle pagina's moet aanpassen.

Uiteindelijk ben ik er uitgekomen:

In de class defaultMemberPage waar al mijn pagina's al van erfden kon ik simpel de functie preLoad toevoegen. Daar prop ik alle logica in die aangeroepen moet worden voordat de content pagina zijn load functie aanroept.

En dat werkt perfect! Ik had er niet bij stil gestaan dat het zo simpel kon zijn.

Bedankt voor alle input !
Pagina: 1