Quanti di voi hanno avuto la necessità di accedere dal code-behind di una pagina aspx ad un controllo presente nella masterpage legata alla pagina? Immagino molti. La soluzione più intuitiva è sicuramente il FindControl sulla proprietà Master, che non tradisce mai:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class _Default : System.Web.UI.Page
7: {
8: protected void Page_Load(object sender, EventArgs e)
9: {
10: Menu masterMenu = this.Master.FindControl("NavigationMenu") as Menu;
11: }
12: }
13: }
Esiste però una tecnica che vi permette di accedere in maniera semplice al contenuto della master page: il MasterType.
Impostando questa direttiva potete istruire la vostra pagina sull’identità (il tipo) della masterpage collegata, tipizzandone la visibilità ed evitando così eventuali cast. Comunque se volete accedere ai controlli della Master (che hanno visibilità protected) dovrete comunque esporli con una property. Prendendo ad esempio il menu della master page del template web di asp.net 4 ci basta esporlo con una property pubblica:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class SiteMaster : System.Web.UI.MasterPage
7: {
8: public Menu MainMenu { get { return this.NavigationMenu; } }
9:
10: protected void Page_Load(object sender, EventArgs e)
11: {
12: }
13: }
14: }
A quel punto aggiungere una voce al menu dalle vostre pagine diventa banalmente:
1: using System;
2: using System.Web.UI.WebControls;
3:
4: namespace WebApplication6
5: {
6: public partial class _Default : System.Web.UI.Page
7: {
8: protected void Page_Load(object sender, EventArgs e)
9: {
10: this.Master.MainMenu.Items.Add(new MenuItem("Nuova Voce Menu"));
11: }
12: }
13: }
Con l’ovvio risultato:
-- Michele