2008-11-03 3 views
1

Lorsque j'ai un contrôle .ASCX enfant qui doit affecter quelque chose dans la page parent, je ne suis pas complètement sûr de la façon dont je suis censé gérer le flux d'événements dans le cas où j'ai besoin de mettre à jour quelque chose dans la page parent.Quel est le meilleur moyen de mettre à jour une page ASPX lorsque ses contrôles ASCX enfant doivent déclencher une modification?

Ce que j'ai toujours fini par faire est de mettre la logique dans le gestionnaire d'événements 'Pre_Render'. Puisqu'il est traité après le traitement de tout contrôle enfant .ascx, je peux être sûr de rendre la page ASPX correctement avant de l'afficher. Je ne pense tout simplement pas que ce soit un bon design et j'ai toujours frôlé quand j'ai dû le faire. Mais maintenant il y a stackoverflow donc je peux enfin le demander!

Par exemple, disons que j'ai un contrôle ascx 'contrôle de connexion' dans une page. La page contenant affiche une étiquette de texte dans la barre d'en-tête pour 'utilisateur actuellement connecté'. Disons que je clique sur le bouton 'login', qui déclenchera alors mon authentification et connecte mon utilisateur. Le problème est que l'étiquette de texte dans la page parente a déjà été affichée comme 'No user logged in'. Ce n'est pas bon! En mettant la logique dans 'PreRender', il sera rendu après que l'utilisateur s'est connecté. Je n'aime pas ça parce que ce n'est pas ce que PreRender est pour.

Quelle est la meilleure pratique prévue ici qui me manque? Je sais que je pourrais mettre un gestionnaire d'événement sur le contrôle de l'utilisateur, mais cela semble maladroit aussi parce qu'il y aurait trop de couplage.

PS. J'utilise juste ceci comme exemple. J'avais eu ce problème de nombreuses autres fois alors s'il vous plaît ne répondez pas en me disant comment mettre en œuvre la connexion!

Répondre

1

Dans votre ascx.cs:

public delegate void NavigateEventHandler(int PID); // if you want a custom handler 
public event NavigateEventHandler onNavigate; 

Dans votre page.aspx.cs:

protected void Page_Init(object sender, EventArgs e) { 
    eSelector1.onNavigate += new PostSelector.NavigateEventHandler(eSelector1_Navigate); } 
public void eSelector1_Navigate(int PID) { 
    eSelector1.PopulateComments(eSelector1.m_PID); } 
Questions connexes