2010-08-25 8 views
4

J'ai besoin des fonctionnalités suivantes dans ma méthode: si la méthode est appelée avant OnLoad événement de cycle de vie ASP.NET, relancez une exception sinon continuez l'exécution de la méthode.Obtenir l'état du cycle de vie de la page ASP.NET

Je pensais à quelque chose comme ceci:

if (Page.LifeCycleState < LifeCycleState.OnLoad) { 
    throw new InvalidPageStateException(); 
} 

Est-il possible de récupérer l'état du cycle de vie de la page ASP.NET?

+1

je ne sais pas s'il y a un indicateur d'état intégré pour les pages asp.net ... mais vous pouvez aussi créer un enum nommé 'LifeCycleState' avec les propriétés d'état et mettre un état varible à maintenir avec ce type enum sur la page et en attrapant des événements sur la page comme onload, oninit vous pouvez définir la valeur currenttate .... – dankyy1

+0

Oui, c'est ce que j'étais penser à savoir s'il n'y a pas une telle fonctionnalité intégrée. –

+1

Souvenez-vous de YAGNI (vous n'en aurez pas besoin). Ne développez que la fonctionnalité dont vous aurez certainement besoin.Il ne sert à rien de maintenir l'état tout au long du cycle de vie de la page si vous êtes uniquement intéressé à savoir si un événement de page a été atteint. Sinon, vous augmenterez le nombre de tests et le potentiel de bogues. Le cycle de vie de la page est complexe lorsque vous prenez en compte les contrôles utilisateur, les pages maîtres et les événements de contrôle. Veuillez considérer cela avant d'écrire une telle énumération. –

Répondre

4

Une approche serait d'utiliser une page de base que vous utilisez toujours dans votre site. Cela contiendrait une variable appelée PageLoadComplete, que vous définiriez à la fin de votre événement PageLoad. Ensuite, vous pouvez vérifier l'état de cette variable à partir de votre méthode.

public abstract class BasePage : System.Web.UI.Page 
{ 
    public bool PageLoadComplete { get; private set; } 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     PageLoadComplete = true; 
    } 
} 

Si vous souhaitez accéder à la variable à partir du code externe à votre page, comme un UserControl, vous devez le rendre public et jeter votre page BasePage.

public partial class MyUserControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     BasePage basePage = this.Page as BasePage; 
     if (basePage != null && !basePage.PageLoadComplete) 
     { 
      throw new InvalidPageStateException(); 
     } 
    } 
} 
+0

Merci @abatishchev –

0

Vous peut-être en mesure de trouver ce que vous cherchez, en regardant les propriétés CurrentHandler et PreviousHandler du HttpContext actuel.

+0

J'ai besoin des informations sur l'état de la page. Je ne comprends pas comment le récupérer depuis HttpContext. –

1

Il est bien dans une réalisation de classe System.Web.UI.Control (realization):

internal ControlState ControlState { 
     get { return _controlState; } 
     set { _controlState = value; } 
    } 

Où est ControlState ENUM qui contient des membres tels que: Initialisé, ViewStateLoaded, Loaded etc. here declaration

Mais comme vous pouvez le voir cette propriété est interne. Donc, seul le moyen d'obtenir l'état de contrôle est proposé par Daniel Dyson.

+0

Eh bien, c'est Spring.NET. J'ai demandé une solution ASP.NET brute. Merci quand même. –

+0

Mes exemples de code sont du code ASP.NET brut. Et le seul moyen d'obtenir l'état de contrôle est proposé par Daniel Dyson. – chapluck

0

si la méthode est appelée avant l'événement OnLoad du cycle de vie ASP.NET jeter une exception autre Poursuit l'exécution de la méthode.

On ne sait pas quel est l'événement Onload, ni où réside la "méthode". Est-ce la Onload de la page ou le OnLoad d'un Control? Est-ce la "méthode" d'une page ou la "méthode" d'un contrôle?

Quoi qu'il en soit, on peut stocker une sorte de drapeau dans le dictionnaire Context.Items, auquel tous les contrôles (y compris la page) ont accès pendant une requête. Cela élimine le besoin d'utiliser une page de base générale comme suggéré ci-dessus.

Dans la méthode OnLoad (peu importe que ce soit une page de l'OnLoad ou le OnLoad Control):

Context.Items[UniqueID] = this; 

Dans la "méthode":

if (Context.Items[UniqueID] != null) 
{ 
    throw new InvalidPageStateException(); 
}