Passer des variables entre UserControl / Page / MasterPage
Question :
Comment communiquer entre la page et un UserControl ? C'est à dire passer des variables ou appeler des méthodes du UserControl à partir de la page ou réciproque.
Si je devais faire un top des questions les plus posés sur le forum d'aspfr, cette question arriverait en deuxième position derrière les problèmes liés aux contrôles dynamiques.
Réponse :
Il y a plusieurs solutions à ce problème.
Par une variable session :
La plus simple à mettre en œuvre consiste à passer par une variable session
public Tutorial tuto
{
get { return Session["Tuto"] as Tutorial; }
set { Session["Tuto"] = value; }
}
Si on ne veut pas mettre la variable en session on peut aussi utiliser le dictionnaire de page, la propriété sera donc définit seulement pour la requête en cours.
public Tutorial tuto
{
get { return Page.Items["Tuto"] as Tutorial; }
set { Page.Items["Tuto"] = value; }
}
En utilisant cette solution je vous conseille d'avoir une convention de nommage au niveau des clés afin d'éviter tout conflit. Vous pouvez aussi utiliser une enum comme ca aucun risque de conflit.
Je conseille cette solution pour des petits projets ou en solution temporaire pour faire des tests.
Par héritage :
J'aime avoir un framework associé au site sur lequel je travaille. Ma solution ressemble donc à ca :
Ainsi dans votre classe Page de base vous pouvez rajouter la propriété
public class Page
{
private Tutorial _currentTutorial;
public Tutorial CurrentTutorial
{
get { return _currentTutorial; }
set { _currentTutorial = value; }
}
// ...
}
public class UserControl
{
public virtual new WebSite10.Web.UI.Page Page
{
get { return (WebSite10.Web.UI.Page)base.Page; }
}
// ...
}
Il faudra alors hériter vos pages de WebSite10.Web.UI.Page et vos contrôles utilisateur de WebSite10.Web.UI.UserControl. La propriété marqué avec le mot clé new permet d'éviter d'avoir besoin de caster la propriété Page en WebSite10.Web.UI.Page, cela permet d'avoir un accès direct à la propriété Page.Tutorial. On peut faire la même chose en VB.
Cette solution est idéale si la plupart de vos pages utilisent cette propriété.
Par une interface :
On peut définir une interface que l'on implémente sur une Page ou UserControl
public interface ITutorial
{
Tutorial CurrentTutorial { get;set; }
}
Dans la page ou l'UserControl vous pouvez caster la page en ITutorial pour accéder à la propriété CurrentTutorial.
((ITutorial)this.Page).CurrentTutorial
Cette solution est idéale lorsque vous devez communiquer entre une page et un UserControl.