The Artima Developer Community
Sponsored Link

.NET Buzz Forum
ASP.NET: Session-Informationen zur richtigen Zeit auslesen

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
ASP.NET: Session-Informationen zur richtigen Zeit auslesen Posted: Jul 5, 2007 12:06 PM
Reply to this message Reply

This post originated from an RSS feed registered with .NET Buzz by -.
Original Post: ASP.NET: Session-Informationen zur richtigen Zeit auslesen
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
Für eine Webanwendung werden meist Sessions benötigt. Darin werden diverse Informationen abgelegt, um von unterschiedlichen Seiten darauf zugreifen zu können. Bei der Verwendung von eigenen UserControls kann es - vor allem für ASP.NET Neulinge - sehr schnell zu einigen Missverständnissen und Fehlverhalten kommen. Daher möchte ich anhand eines kurzen Beispiels erklären, worauf generell zu achten ist.

Ausgangssituation


Erstellt werden soll eine kleine Webanwendung, welche aus einem simplen Menü und einem Login besteht. Sowohl das Menü, als auch das Login wird über ein von System.Web.UI.UserControl abgeleitetes Steuerelement dargestellt. Nach einem erfolgreichen Login, soll das Menü weitere, zusätzliche, Menüpunkte aufweisen.

Umsetzung


Da für diese Anwendung eine Session benötigt werden, wurde eine eigene Klasse SessionData erstellt, die grundlegende und für die Anwendung wichtige Informationen enthält. Hauptsächlich handelt es sich dabei um Informationen zum User, die an unterschiedlichen Stellen benötigt werden und nicht überall nachgeladen werden sollen.
Zusätzlich wurde eine Klasse SessionList erstellt, welche alle aktuellen Sessions zugeteilt bekommt und bestimmte Funktionalitäten aufweist, die für das Session-Handling notwendig sind (Prüfung auf Gültigkeit, ist die Session bereits abgelaufen, usw.). Diese Klasse wird in der Global.asax im Eventhandler Application_Start instanziiert.

Die Default.aspx stellt die Haupteinstiegs-Seite dar und enthält - wie bereits oben erwähnt - dein Menü-Control und ein Login-Control, die beide selbst erstellt wurden und daher auch ein bestimmtes notwendiges Verhalten an den Tag legen.

Sehen wir uns nun den Sourcecode der Default.aspx genauer an:
private SessionData _sessionData = null;

protected void Page_PreRender(object sender, EventArgs e)
{
    _sessionData = Session["sessionInfo"] as SessionData;

    if (Session["sessionInfo"] != null)
    {
        _sessionData = (SessionData)Session["sessionInfo"];

        foreach (Control c in ContentPlaceHolder.Controls)
        {
            if (c.ID == "loginControl")
            {
                ContentPlaceHolder.Controls.Remove(c);
                break;
            }
        }
    }
}

protected void Page_Init(object sender, EventArgs e)
{
    if (_sessionData == null)
    {
        Control loginControl = LoadControl("modules/LoginControl.ascx");
        loginControl.ID = "loginControl";
        this.ContentPlaceHolder.Controls.Clear();
        this.ContentPlaceHolder.Controls.Add(loginControl);
    }
    else
    {
        this.ContentPlaceHolder.Controls.Clear();
    }

    Control menuControl = LoadControl("modules/MenuControl.ascx");
    menuControl.ID = "menuControl";
    MenuPlaceHolder.Controls.Clear();
    MenuPlaceHolder.Controls.Add(menuControl);
}

protected void Page_Load(object sender, EventArgs e)
{
    
}

Wie zu sehen ist, werden grundsätzlich zwei Events bedient (Page_Load wurde nur angeführt um zu zeigen, dass sich hierin keinerlei Sourcecode befindet):
- Page_Init
- Page_PreRender

Wie im Artikel ASP.NET: Die PostBack-Falle unter Lebensyklen beschrieben, müssen wir bei unserem Source nun darauf aufpassen, welches Event wann gefeuert und welche Methode wann aufgerufen wird. Kommen UserControls ins Spiel, muss natürlich deren Lebenszyklus ebenfalls betrachtet werden (UserControls unterliegen den gleichen Lebenszyklen wie Seiten).

Im initialen Aufruf der Default.aspx wird zuerst Page_Init aufgerufen. Darin wird festgestellt, dass es keine aktuelle Session gibt und das LoginControl geladen. Dieses enthält folgenden Sourcecode:
public partial class LoginControl 
    : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        LoginButton.Click += new EventHandler(LoginButton_Click);
    }

    protected void LoginButton_Click(object sender, EventArgs e)
    {
        // Implementierung Login
    }
}

Sobald also das LoginControl instanziiert wird, werden die einzelnen Events durchlaufen. In diesem Fall Page_Load. An dieser Stelle wird lediglich der Button-Handler gesetzt. Es passiert noch nichts großartiges.

Wenn wir wieder zurück zur Default-Seite gehen, wird nach dem Laden des Login-Controls das Menü geladen. Dieses enthält lediglich ein originales ASP.NET MenuControl und folgenden Source:

protected void Page_PreRender(object sender, EventArgs e)
{
    if (Session["sessionInfo"] == null)
    {
        foreach (MenuItem mi in MainMenu.Items)
        {
            if (mi.Value != "Home")
            {
                mi.Enabled = false;
                mi.Selectable = false;
            }
        }
    }
    else
    {
        foreach (MenuItem mi in MainMenu.Items)
        {
            mi.Enabled = true;
            mi.Selectable = true;
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    
}

Hier wird nun im Page_PreRender überprüft, ob bereits eine Session gesetzt wurde. Dies ist vor dem Einloggen nun auch nicht Fall, wodurch bis auf den Home-Eintrag alle weiteren deaktiviert werden.

Nun kommt es zum Login. Die Daten werden per Post an den Server übertragen. Hier wird nun folgende Reihenfolge ausgeführt:

1. Default.aspx: Page_Init
2. LoginControl.ascx: Page_Load
3. Default.aspx: Page_PreRender
4. MenuControl.ascx: Page_PreRender

Verfolgt man diese Reihenfolge im Sourcecode, ist schön zu sehen, wie und vor allem wann Session-Informationen ausgelesen werden müsssen, um korrekt angewandt zu werden. Daher verweise ich nochmals an den Artikel ASP.NET: Die PostBack-Falle, welcher den Lebenszyklus von Seiten genau auflistet.

Fazit


Dieser Artikel sollte sein, wie mit Session-Informationen unter Verwendung von UserControls umgegangen und worauf geachtet werden soll. Unter Berücksichtigung des Lebenszykluses der Seite bzw. der gesamten Webanwendung (als auch der verwendeten UserControls) lassen sich dadurch entstehende Probleme schnell eingrenzen und lösen.

Read: ASP.NET: Session-Informationen zur richtigen Zeit auslesen

Topic: TeamCity 2.1.1 Released Previous Topic   Next Topic Topic: EXIF Informationen mit C# und Boardmitteln auslesen

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use