Share via


masterpages

Le pagine master consentono di creare pagine ASP.NET con un tema e uno stile coerenti. Stephen Walther descrive come sfruttare questa nuova funzionalità

In questa pagina

Introduzione Introduzione
Pagine master e pagine di contenuto Pagine master e pagine di contenuto
Creazione di una semplice pagina master Creazione di una semplice pagina master
Creazione di una semplice pagina di contenuto Creazione di una semplice pagina di contenuto
Creazione di una pagina master con un sistema di spostamento Creazione di una pagina master con un sistema di spostamento
Nidificazione di più pagine master Nidificazione di più pagine master
Configurazione delle pagine master Configurazione delle pagine master
Override delle proprietà delle pagine master Override delle proprietà delle pagine master
Utilizzo dell'attributo title della pagina Utilizzo dell'attributo title della pagina
Override degli attributi dell'intestazione HTML Override degli attributi dell'intestazione HTML
Esposizione di proprietà e metodi da una pagina master Esposizione di proprietà e metodi da una pagina master
Caricamento dinamico di pagine master Caricamento dinamico di pagine master
Conclusioni Conclusioni

Introduzione

Le pagine master, una nuova funzionalità di Microsoft ASP.NET 2.0, consentono di applicare uno stesso layout a più pagine di contenuto di un'applicazione Web. Le pagine master offrono un metodo semplice per creare un aspetto coerente per un sito Web.

Nella maggior parte delle applicazioni Web, le pagine contengono elementi standard quali logo, menu di spostamento e informazioni sul copyright. È possibile inserire tutti questi elementi in una singola pagina master. Basando le pagine di contenuto dell'applicazione su questa pagina master, tutte le pagine di contenuto includeranno automaticamente gli stessi elementi standard.

In questo articolo verrà illustrato come sfruttare le pagine master per creare layout di pagina standard e saranno esaminate alcune funzionalità avanzate delle pagine master. Verrà ad esempio descritto come modificare le proprietà di intestazione, quali titoli di pagina e metatag in una pagina di contenuto, e come caricare dinamicamente diverse pagine master in fase di esecuzione.

 

Pagine master e pagine di contenuto

Per iniziare, verrà creata una semplice pagina master. Per creare pagine master è possibile utilizzare Notepad o sfruttare Microsoft Visual Web Developer per trarre vantaggio dal completo supporto della finestra di progettazione durante la creazione delle pagine master (vedere la figura 1). In questo articolo non si presuppone l'utilizzo di Visual Web Developer, benché tale strumento renda più semplice la creazione di pagine master.

Figura 1. Supporto della finestra di progettazione per le pagine master

 

Creazione di una semplice pagina master

Una pagina master viene creata in modo simile a una normale pagina ASP.NET e può contenere gli stessi controlli Web, controlli utente, contenuti HTML e script utilizzabili nelle pagine ASP.NET. Tra una pagina master e una normale pagina ASP.NET esistono tre importanti differenze.

Innanzitutto, a differenza di una normale pagina ASP.NET, il nome di una pagina master deve terminare con la speciale estensione master. Questa estensione contrassegna la pagina come pagina master. Un'applicazione ASP.NET viene inoltre configurata in modo da non consentire la richiesta di pagine con estensione master. Non è infatti necessario richiedere direttamente una pagina master: vengono richieste le pagine di contenuto basate sulla pagina master.

In secondo luogo, una pagina master include una direttiva <%@ Master %> anziché la normale direttiva <%@ Page %>. La direttiva <%@ Master %> supporta molti degli attributi utilizzabili per la direttiva <%@ Page %>. È ad esempio possibile specificare il linguaggio di programmazione della pagina con la direttiva <%@ Master Language="vb" %>.

Infine, l'ultima differenza tra una pagina master e una normale pagina ASP.NET è costituita dal fatto che una pagina master può contenere uno o più controlli ContentPlaceHolder. Un controllo ContentPlaceHolder può essere utilizzato soltanto all'interno di una pagina master e contrassegna un'area di una pagina master di cui una determinata pagina di contenuto può eseguire l'override.

La pagina master dell'esempio 1, denominata Simple.master, contiene una tabella HTML con due controlli ContentPlaceHolder.

Esempio 1. Simple.master

<%@ Master %>
<html>
<head>
    <title>Simple Master Page</title>
</head>
<body>
<form id="form1" runat="server">
<table width="100%">
<tr>
    <td>
    <asp:ContentPlaceHolder 
        id="ContentPlaceHolder1" 
        runat="server" />
    </td>
    <td>
    <asp:ContentPlaceHolder 
        id="ContentPlaceHolder2" 
        runat="server" />
    </td>
</tr>
</table>
</form>
</body>
</html>

La pagina master dell'esempio 1 contiene due controlli ContentPlaceHolder, denominati ContentPlaceHolder1 e ContentPlaceHolder2. Questi due controlli contrassegnano le aree della pagina master che possono essere modificate nel caso di determinate pagine di contenuto. Aprendo la pagina master dell'esempio 1 nella finestra di progettazione di Visual Web Developer, verrà visualizzata la pagina illustrata nella figura 2.

Figura 2. Pagina master Simple.master

La pagina master dell'esempio 1 contiene i tag HTML standard di apertura, come ad esempio <title> e <body>. In genere è opportuno includere questi tag standard nelle pagine master. Nella sezione "Override delle proprietà delle pagine master" più avanti in questo articolo verrà illustrato come è possibile modificare il titolo in determinate pagine di contenuto.

La pagina master include inoltre il tag lato server <form>. Poiché in una pagina ASP.NET è consentito un solo tag lato server <form>, quasi sempre è preferibile includere questo tag nella pagina master.

 

Creazione di una semplice pagina di contenuto

Una volta creata una pagina master, è possibile basare una o più pagine di contenuto su tale pagina. Una pagina di contenuto è la pagina effettiva richiesta dal browser e dispone della stessa estensione aspx dei file ASP.NET. È simile a una normale pagina ASP.NET, con due importanti eccezioni.

Innanzitutto, tutto il contenuto di una pagina di contenuto deve essere incluso in controlli Content, che vengono utilizzati per associare le aree di contenuto di una pagina di contenuto alle aree di contenuto contrassegnate dai controlli ContentPlaceHolder in una pagina master.

In secondo luogo, una pagina di contenuto deve essere associata a una pagina master. È possibile associare una pagina di contenuto a una pagina master mediante un attributo della direttiva <%@ Page %>. In alternativa, è possibile utilizzare un file di configurazione Web per associare più pagine di contenuto a una pagina master.

Ad esempio, la pagina di contenuto dell'esempio 2 contiene due controlli Content, corrispondenti ai controlli ContentPlaceHolder della pagina master dell'esempio 1.

Esempio 2. Simple.aspx

<%@ Page MasterPageFile="~/Simple.master" %>
<asp:Content 
    ID="Content1" 
    ContentPlaceHolderID="ContentPlaceHolder1" 
    Runat="server">
    Content in Left Column
</asp:Content>
<asp:Content 
    ID="Content2" 
    ContentPlaceHolderID="ContentPlaceHolder2" 
    Runat="server">
    Content in Right Column
</asp:Content>

La pagina di contenuto illustrata nell'esempio 2 include un attributo MasterPageFile nella direttiva <%@ Page %>, che associa la pagina di contenuto alla pagina master dell'esempio 1.

Entrambi i controlli Content includono del testo tra i relativi tag di apertura e di chiusura. In questo caso, i controlli Content contengono semplicemente testo, ma all'interno di questi controlli è possibile aggiungere qualsiasi contenuto, inclusi controlli Web e controlli utente.

Quando si modifica una pagina di contenuto in Visual Web Developer, la pagina master viene nascosta in background (vedere la figura 3). Visual Web Developer aggiunge automaticamente controlli Content corrispondenti a ciascun controllo ContentPlaceHolder della pagina master.

Figura 3. Modifica di una pagina di contenuto in Visual Web Developer

 

Creazione di una pagina master con un sistema di spostamento

La pagina master e la pagina di contenuto illustrate nella sezione precedente sono estremamente semplici. Nelle implementazioni reali in genere si desidera aggiungere a una pagina master elementi di spostamento standard, come una barra dei menu e percorsi "bread crumb". In questa sezione verrà descritto il processo per la creazione di una pagina master più complessa (vedere la figura 4).

Figura 4. Pagina master più complessa

La pagina master conterrà un controllo SiteMapPath e un controllo Menu per lo spostamento. Il controllo SiteMapPath consente di visualizzare un percorso bread crumb, mentre con il controllo Menu viene visualizzato un menu di spostamento. Entrambi questi controlli utilizzeranno il file sitemap illustrato nell'esempio 3.

Esempio 3. web.sitemap

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
    <siteMapNode url="~/Default.aspx" title="Home">
   <siteMapNode url="~/Products.aspx" title="Products"/>
   <siteMapNode url="~/Services.aspx" title="Services"/>
    </siteMapNode>
</siteMap>

Nel file sitemap dell'esempio 3 vengono definiti tre nodi: una home page, una pagina dei prodotti e una pagina dei servizi. Per ciascun nodo vengono specificati un URL e un attributo title. Questo file viene utilizzato dalla pagina master dell'esempio 4 per i controlli SiteMapPath e Menu.

Esempio 4. NavMaster.master

<%@ Master %>
<html>
<head>
    <title>NavMaster</title>
</head>
<body>
    <form id="form1" runat="server">

        <table 
            width="100%"
            border="0"
            cellpadding="5">
        <tr>
            <td colspan="2">
            <asp:Image 
                id="Image1"
                ImageUrl="~/Logo.gif" Runat="Server" />
            </td>
        </tr>
        <tr bgcolor="lightblue">
            <td colspan="2">
            <asp:SiteMapPath 
                id="SiteMapPath1" 
                Runat="Server" />             
            </td>
        </tr>
        </table>
        <table width="100%" cellpadding="10" border="0">
        <tr>
            <td valign="top" width="100" bgcolor="#eeeeee">
            <asp:Menu 
                id="Menu" 
                Runat="Server" 
                DataSourceID="SiteMapDataSource1" 
                StaticDisplayLevels="2" />
            </td>
            <td valign="top">
            <asp:contentplaceholder 
                id="ContentColumn" 
                runat="server" />
            </td>
            <td valign="top" width="100" bgcolor="#eeeeee">
            <asp:ContentPlaceHolder 
                id="AdColumn" 
                runat="server">
                <asp:Image
                    ID="Ad1" 
                    ImageUrl="Ad1.gif"
                    Runat="Server" />
                <br />
                <asp:Image
                    ID="Ad2"  
                    ImageUrl="Ad2.gif"
                    Runat="Server" />
            </asp:ContentPlaceHolder>
            </td>
        </tr>
        </table>     
        <small>All contents copyright &copy; 
  2004 by Microsoft Hair Stylists</small>
        <asp:SiteMapDataSource ID="SiteMapDataSource1" 
  Runat="server" />
    </form>
</body>
</html>

La pagina master dell'esempio 4 contiene due controlli ContentPlaceHolder. Il primo controllo ContentPlaceHolder viene utilizzato come segnaposto per il contenuto principale della pagina, mentre il secondo controllo ContentPlaceHolder opera come segnaposto per il contenuto pubblicitario.

Il secondo controllo ContentPlaceHolder include contenuto predefinito e contiene due controlli Image utilizzati per visualizzare banner pubblicitari (vedere la figura 5). Questo contenuto predefinito può essere sottoposto a override in determinate pagine di contenuto.

Figura 5. Pagina master NavMaster.master

Infine, la pagina di contenuto dell'esempio 5 è basata sulla pagina master NavMaster.master (vedere la figura 6) e include un singolo controllo Content con il contenuto per l'area di contenuto principale della pagina master.

Figura 6. Pagina Products.aspx

Esempio 5. Products.aspx

<%@ Page MasterPageFile="~/NavMaster.master" %>
<asp:Content 
    ID="Content1" 
    ContentPlaceHolderID="ContentColumn" 
    Runat="server">
    This is the Products.aspx page
</asp:Content>

 

Nidificazione di più pagine master

Finora è stato illustrato come creare una singola pagina master e come basare una pagina di contenuto su questa pagina master. Un sito Web può includere più pagine master: è ad esempio possibile creare differenti pagine master per le varie sezioni del sito Web.

Se necessario, è anche possibile nidificare più pagine master. Si può ad esempio creare una pagina master per l'intero sito Web e quindi nidificare pagine master di livello inferiore per le singole sezioni. Visual Web Developer non fornisce il supporto della finestra di progettazione per questa operazione. Di conseguenza, per nidificare pagine master è necessario utilizzare la visualizzazione del codice sorgente o creare le pagine tramite Notepad.

È ad esempio possibile utilizzare la pagina illustrata nell'esempio 6 come pagina master del sito. Questa pagina master contiene i tag HTML di apertura e di chiusura, i tag Form e un singolo controllo ContentPlaceHolder.

Esempio 6. SiteMaster.master

<%@ Master %>
<html>
<head>
    <title>Site Master</title>
</head>
<body bgcolor="LightGreen">
    <form id="form1" runat="server">
        <h1>Site Master Page</h1>
        <asp:contentplaceholder 
            id="SiteContentPlaceHolder" 
            runat="server" />
    </form>
</body>
</html>

La pagina dell'esempio 7 è una pagina master nidificata, che esegue l'override del contenuto della pagina master del sito. Si noti che la direttiva <%@ Master %> fa riferimento alla pagina master SiteMaster.master.

Esempio 7. SectionMaster.master

<%@ Master  MasterPageFile="~/SiteMaster.master" %>
<asp:content
    ContentPlaceHolderID="SiteContentPlaceHolder" 
    runat="server">
    
    <table width="100%" bgcolor="LightYellow">
    <tr>
        <td colspan="2">
        <h1>Section Master Page</h1>
        </td>
    </tr>
    <tr>
        <td>
        <asp:ContentPlaceHolder   
            id="LeftColumn"
            Runat="Server" />     
        
        </td>
        <td>
        <asp:ContentPlaceHolder   
            id="RightColumn"
            Runat="Server" />     
        </td>
    </tr>
    </table>
    
</asp:content>

Infine, la pagina di contenuto dell'esempio 8 è basata sulla pagina master di sezione ed esegue l'override dei due controlli ContentPlaceHolder inclusi nella pagina master di sezione.

Esempio 8. NestedMasters.aspx

<%@ Page MasterPageFile="~/SectionMaster.master" %>

<asp:Content    
    ContentPlaceHolderId="LeftColumn"
    Runat="Server">

    This content appears in the left column

</asp:Content>


<asp:Content   
    ContentPlaceHolderId="RightColumn"
    Runat="Server">

    This content appears in the right column

</asp:Content>

Il risultato è il rendering della pagina illustrata nella figura 7. Il contenuto della pagina master del sito e quello della pagina master di sezione vengono uniti in modo da generare la pagina di contenuto finale. Il contenuto della pagina master del sito viene visualizzato in verde, mentre il contenuto della pagina master di sezione è riportato in giallo.

Figura 7. Pagina master nidificata

 

Configurazione delle pagine master

Anziché associare una pagina di contenuto a una pagina master mediante la direttiva <%@ Page %>, è possibile associare una pagina master a una pagina di contenuto nel file di configurazione dell'applicazione Web. L'utilizzo del file di configurazione semplifica la gestione dei siti Web di grandi dimensioni, poiché consente di modificare la pagina master associata a numerose pagine di contenuto in un'unica posizione.

La pagina master viene impostata nell'elemento <pages> di un file di configurazione, incluso nella sezione <system.web> del file. Ad esempio, con l'elemento <pages> riportato di seguito si imposta la pagina master predefinita su "SuperMaster.master":

<pages masterPageFile="SuperMaster.master" />

Quando si assegna una pagina master tramite un file di configurazione, è necessario considerare due aspetti. Innanzitutto, l'impostazione di una pagina master in una pagina di contenuto ha la precedenza rispetto a qualsiasi pagina master impostata nel file di configurazione. Pertanto, se si desidera utilizzare il file Web.Config per impostare le pagine master, è consigliabile non includere l'attributo MasterPageFile nelle pagine di contenuto.

In secondo luogo, l'applicazione può contenere più file Web.Config in diverse sottocartelle, in modo da impostare diverse pagine master. In altri termini, è possibile eseguire l'override della pagina master impostata in un file Web.Config all'interno di una sottocartella creando un nuovo file Web.Config.

 

Override delle proprietà delle pagine master

Un problema che si riscontra quasi immediatamente durante l'utilizzo delle pagine master è rappresentato dall'override di proprietà come il titolo e i metatag di una pagina master nelle singole pagine di contenuto. In genere si desidera visualizzare titoli univoci per ciascuna pagina di contenuto, anche quando le singole pagine di contenuto sono basate su una pagina master condivisa.

Per eseguire l'override del contenuto di una pagina master in una determinata pagina di contenuto sono disponibili più metodi, che verranno illustrati di seguito.

 

Utilizzo dell'attributo title della pagina

Se si desidera semplicemente modificare il titolo di una pagina di contenuto di cui viene eseguito il rendering da una pagina master, è possibile sfruttare l'attributo Title della direttiva <%@ Page %>. Questo attributo ha effetto solo quando nella pagina master viene utilizzato un controllo lato server HtmlHead.

La pagina master dell'esempio 9 contiene un controllo lato server HtmlHead.

Esempio 9. TitleMaster.master

<%@ Master %>
<html>
<head runat="server">
    <title>Master Title</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:contentplaceholder 
        id="ContentPlaceHolder1" 
        runat="server" />
    </form>
</body>
</html>

Il tag <head> dell'esempio 9 include un attributo runat="server" che trasforma il tag <head> in un controllo lato server HtmlHead.

La pagina di contenuto dell'esempio 10 esegue l'override del titolo della pagina. La direttiva <%@ Page %> all'inizio di questa pagina dispone di un valore per l'attributo Title. Quando viene eseguito il rendering della pagina, il testo "Content Page Title" viene visualizzato come titolo della pagina.

Esempio 10. TitleContent.aspx

<%@ Page MasterPageFile="~/TitleMaster.master" Title="Content Page Title" %>

<asp:Content
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    
    Here is some content
    
</asp:Content>

 

Override degli attributi dell'intestazione HTML

Se è necessario eseguire l'override di altri attributi di un'intestazione HTML, come metatag o tag di stile, è possibile fare riferimento all'elemento HtmlHead direttamente da una pagina di contenuto. Il controllo HtmlHead implementa l'interfaccia IPageHeader, che include le proprietà riportate di seguito.

  • LinkedStyleSheets: fogli di stile esterni collegati alla pagina HTML.

  • Metadata: insieme di tag Metadata.

  • StyleSheet: stili applicati alla pagina HTML.

  • Title: titolo della pagina HTML.

Queste proprietà possono essere modificate all'interno di una pagina di contenuto. Ad esempio, la pagina master dell'esempio 11 include un controllo lato server HtmlHead che può essere sottoposto a override in una pagina di contenuto.

Esempio 11. HeaderMaster.master

<%@ Master %>

<html>
<head runat="server">
    <title>Master Title</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:contentplaceholder 
        id="ContentPlaceHolder1" 
        runat="server" />
    </form>
</body>
</html>

Nella pagina di contenuto dell'esempio 12 vengono modificate le proprietà Title e Metadata del controllo HtmlHead per visualizzare contenuto personalizzato.

Esempio 12. HeaderContent.aspx (Microsoft Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/HeaderMaster.master" %>

<script runat="server">

    Sub Page_Load()
        Master.Page.Header.Title = "Content Title"
        Master.Page.Header.Metadata.Add("Keywords", "blah,blah")
        Master.Page.Header.Metadata.Add("Description", "blah,blah")
    End Sub
    
</script>

<asp:Content
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    
    Here is some content
    
    </asp:Content> 

Esempio 12. HeaderContent.aspx (C#)

<%@ Page Language="c#" MasterPageFile="~/HeaderMaster.master" %>

<script runat="server">

    void Page_Load() {
        Master.Page.Header.Title = "Content Title";
        Master.Page.Header.Metadata.Add("Keywords", "blah,blah");
        Master.Page.Header.Metadata.Add("Description", "blah,blah");
    }
    
</script>

<asp:Content ID="Content1"
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    
    Here is some content
    
    </asp:Content>

La proprietà Master dell'oggetto Page fa riferimento alla pagina master della pagina di contenuto (se lo si desidera, è possibile utilizzare Page.Master anziché Master). La proprietà Header fa riferimento all'elemento HtmlHead. Nella pagina di contenuto dell'esempio 12 vengono modificate le proprietà Title e Metadata del controllo HtmlHead.

 

Esposizione di proprietà e metodi da una pagina master

Se è necessario un maggiore controllo sul contenuto di una pagina master, si possono esporre proprietà e metodi dalla pagina master. È possibile modificare le proprietà pubbliche esposte da una pagina master in una pagina di contenuto, oltre che effettuare chiamate ai metodi pubblici esposti da una pagina master in una pagina di contenuto.

Si supponga ad esempio di voler modificare il contenuto del piè di pagina di una pagina master in una pagina di contenuto. La pagina master dell'esempio 13 espone una proprietà pubblica denominata Footer.

Esempio 13. FooterMaster.master (Visual Basic .NET)

<%@ Master Language="VB" %>

<script runat="server">

    Private _footer As String
    
    Public Property Footer() As String
        Get
            Return _footer
        End Get
        Set(ByVal value As String)
            _footer = value
        End Set
    End Property
    
</script>

<html>
<head runat="server">
    <title>Footer Master</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:contentplaceholder 
        id="ContentPlaceHolder1" 
        runat="server" />
    <br />
    <small><%= _footer %></small>
    </form>
</body>
</html>

Esempio 13. FooterMaster.master (C#)

<%@ Master Language="C#" %>

<script runat="server">

    private string _footer;
    
    public string Footer {
        get {
            return _footer;
        }
        set {
            _footer = value;
        }
    }
    
</script>

<html>
<head id="Head1" runat="server">
    <title>Footer Master</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:contentplaceholder 
        id="ContentPlaceHolder1" 
        runat="server" />
    <br />
    <small><%= _footer %></small>
    </form>
</body>
</html>

Nell'esempio 13, la proprietà pubblica Footer modifica un campo privato denominato _footer, visualizzato nella parte inferiore della pagina master mediante l'espressione inline <%= _footer %>.

La pagina di contenuto dell'esempio 14 imposta la proprietà Footer. La proprietà Footer viene esposta mediante la proprietà Master dell'oggetto Page. In genere la proprietà Master rappresenta un oggetto MasterPage. Tuttavia, questa pagina di contenuto include una direttiva <%@ MasterType %> che esegue il cast del valore della proprietà Master in un oggetto FooterMaster.

Esempio 14. FooterContent.aspx (Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/FooterMaster.master" %>
<%@ MasterType VirtualPath="~/FooterMaster.master" %>

<script runat="server">

    Sub Page_Load()
        Master.Footer = "Custom Page Footer"
    End Sub
    
</script>

<asp:Content
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    Here is some content    
</asp:Content>

Esempio 14. FooterContent.aspx (C#)

<%@ Page Language="C#" MasterPageFile="~/FooterMaster.master" %>
<%@ MasterType VirtualPath="~/FooterMaster.master" %>

<script runat="server">

    void Page_Load() {
        Master.Footer = "Custom Page Footer";
    }
    
</script>

<asp:Content ID="Content1"
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    Here is some content    
</asp:Content>

Esponendo le proprietà e i metodi in una pagina master, è possibile modificare qualsiasi aspetto del rendering di una pagina master.

 

Caricamento dinamico di pagine master

In questa sezione finale verrà descritta un'applicazione avanzata delle pagine master, illustrando come caricare dinamicamente diverse pagine master in fase di esecuzione.

Il caricamento dinamico delle pagine master si rivela utile in alcune circostanze. Può ad esempio essere necessario effettuare il co-branding del sito Web con uno o più siti Web dei partner. Quando viene inserito un collegamento al sito Web nel sito Web di un partner, può essere opportuno caricare dinamicamente una pagina master corrispondente all'aspetto del sito Web del partner.

Il caricamento dinamico delle pagine master può inoltre rivelarsi utile quando si desidera consentire agli utenti dell'applicazione di selezionare un layout di pagina. È possibile fornire agli utenti un set di pagine master standard. Gli utenti dell'applicazione potranno quindi scegliere il layout di pagina che preferiscono selezionando la pagina master desiderata.

È possibile caricare dinamicamente una pagina master assegnando un valore alla proprietà MasterPageFile dell'oggetto Page. Il valore assegnato a questa proprietà deve corrispondere al percorso relativo di un file di pagina master valido.

Quando si utilizza la proprietà MasterPageFile, è necessario tenere presente un'importante limitazione. È possibile assegnare un valore a questa proprietà solo prima o durante l'evento Page_PreInit, che costituisce il primo evento nel ciclo di esecuzione della pagina. Se si tenta di assegnare un valore alla proprietà durante un evento successivo, ad esempio Page_Load, verrà generata un'eccezione. Questa limitazione dipende dal fatto che differenti pagine master determinano il caricamento nella pagina di diversi set di controlli.

Nella pagina di contenuto illustrata nell'esempio 15 viene utilizzata la proprietà MasterPageFile per caricare dinamicamente diverse pagine master in fase di esecuzione.

Esempio 15. DynamicContent.aspx (Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/DynamicMaster1.master" %>

<script runat="server">
    
    Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs)
        MasterPageFile = Profile.Master
    End Sub

</script>

<asp:Content
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    Here is the content
</asp:Content> 

Esempio 15. DynamicContent.aspx (C#)

<%@ Page Language="c#" MasterPageFile="~/DynamicMaster1.master" %>

<script runat="server">
    
    void Page_PreInit(Object sender, EventArgs e) {
        MasterPageFile = Profile.Master;
    }

</script>

<asp:Content ID="Content1"
    ContentPlaceHolderID="ContentPlaceHolder1"
    Runat="Server">
    Here is the content
</asp:Content>

Nell'esempio 15, una pagina master viene caricata dinamicamente nell'evento PreInit. In questo caso, il percorso del file di pagina master viene caricato dal profilo dell'utente. È possibile utilizzare un profilo per memorizzare in modo permanente le informazioni associate a un utente, in modo che la pagina master selezionata dall'utente non vada perduta nel passaggio da una pagina all'altra.

Per sfruttare il profilo utente, è necessario aggiungere le seguenti impostazioni di configurazione alla sezione <system.web> del file Web.Config dell'applicazione:

<anonymousIdentification enabled="true" />
     
 <profile>
 <properties>
    <add 
   name="Master" 
    allowAnonymous="true" 
   defaultValue="DynamicMaster1.master" />
 </properties>
 </profile>

Con queste impostazioni viene creata una nuova proprietà Profile denominata Master, utilizzabile sia da utenti anonimi che da utenti autenticati.

Con la pagina di contenuto dell'esempio 15 viene caricata una delle due pagine master denominate DynamicMaster1.master e DynamicMaster2.master. Il codice sorgente per DynamicMaster1.master è riportato nell'esempio 16, mentre il codice sorgente per DynamicMaster2.master è riportato nell'esempio 17. Queste pagine master sono identiche, ma dispongono di nomi e colori di sfondo differenti.

Esempio 16. DynamicMaster1.master (Visual Basic .NET)

<%@ Master Language="vb" %>
<script runat="server">

    Sub Page_Load()
        If Not IsPostBack Then
            dropMaster.SelectedValue = Profile.Master
        End If
    End Sub
    
    Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)
        Profile.Master = dropMaster.SelectedValue
        Response.Redirect(Request.Path)
    End Sub
    
</script>

<html>
<head>
    <title>Dynamic Master 1</title>
</head>
<body bgcolor="LightYellow">
<form runat="server">
<h1>Dynamic Master 1</h1>
<p>
<asp:DropDownList 
    id="dropMaster"
    AutoPostBack="true"
    OnSelectedIndexChanged="SelectMaster" 
    ValidationGroup="Master" 
    Runat="Server">
    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />
    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" />
</asp:DropDownList>
</p>
<asp:contentplaceholder 
    id="ContentPlaceHolder1" 
    runat="server" />
</form>
</body>
</html>

Esempio 16. DynamicMaster1.master (C#)

<%@ Master Language="c#" %>

<script runat="server">
    
    void Page_Load() {
        if (!IsPostBack)
            dropMaster.SelectedValue = Profile.Master;
        }
    
    void SelectMaster(Object s, EventArgs e) {
        Profile.Master = dropMaster.SelectedValue;
        Response.Redirect(Request.Path);
    }
    
</script>

<html>
<head>
    <title>Dynamic Master 1</title>
</head>
<body bgcolor="LightYellow">
<form id="Form1" runat="server">
<h1>Dynamic Master 1 CS</h1>
<p>
<asp:DropDownList 
    id="dropMaster"
    AutoPostBack="true"
    OnSelectedIndexChanged="SelectMaster" 
    ValidationGroup="Master" 
    Runat="Server">
    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />
    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" />
</asp:DropDownList>
</p>
<asp:contentplaceholder 
    id="ContentPlaceHolder1" 
    runat="server" />
</form>
</body>
</html>

Esempio 17. DynamicMaster2.master (Visual Basic .NET)

<%@ Master Language="vb" %>
<script runat="server">
    Sub Page_Load()
        If Not IsPostBack Then
            dropMaster.SelectedValue = Profile.Master
        End If
    End Sub
    
    Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)
        Profile.Master = dropMaster.SelectedValue
        Response.Redirect(Request.Path)
    End Sub
    
</script>

<html>
<head>
    <title>Dynamic Master 2</title>
</head>
<body bgcolor="LightGreen">
<form id="Form1" runat="server">
<h1>Dynamic Master 2</h1>
<p>
<asp:DropDownList 
    id="dropMaster"
    AutoPostBack="true"
    OnSelectedIndexChanged="SelectMaster" 
    ValidationGroup="Master"
    Runat="Server">
    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />
    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" />
</asp:DropDownList>
</p>
<asp:contentplaceholder 
    id="ContentPlaceHolder1" 
    runat="server" />
</form>
</body>
</html>

Esempio 17. DynamicMaster2.master (C#)

<%@ Master Language="c#" %>
<script runat="server">
    
    void Page_Load() {
        if (!IsPostBack)
            dropMaster.SelectedValue = Profile.Master;
        }
    
    void SelectMaster(Object s, EventArgs e) {
        Profile.Master = dropMaster.SelectedValue;
        Response.Redirect(Request.Path);
    }
    
</script>

<html>
<head>
    <title>Dynamic Master 2</title>
</head>
<body bgcolor="LightGreen">
<form id="Form1" runat="server">
<h1>Dynamic Master 2 CS</h1>
<p>
<asp:DropDownList 
    id="dropMaster"
    AutoPostBack="true"
    OnSelectedIndexChanged="SelectMaster" 
    ValidationGroup="Master"
    Runat="Server">
    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />
    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" />
</asp:DropDownList>
</p>
<asp:contentplaceholder 
    id="ContentPlaceHolder1" 
    runat="server" />
</form>
</body>
</html>

Entrambe le pagine master contengono un controllo DropDownList che consente all'utente di selezionare una determinata pagina master. Quando l'utente seleziona una pagina master, viene chiamato il metodo SelectMaster, che assegna al profilo utente la pagina master selezionata e ricarica la pagina corrente. È necessario ripetere il caricamento della pagina poiché la pagina master appena selezionata deve essere caricata durante l'evento PreInit.

 

Conclusioni

Le pagine master costituiscono una nuova, eccezionale funzionalità di ASP.NET 2.0 che avrà grande influenza sul modo in cui in futuro verranno sviluppate le applicazioni ASP.NET. Finora era possibile usare controlli utente o classi Page personalizzate per creare layout di pagina riutilizzabili. Le pagine master offrono un metodo semplice e intuitivo per eseguire questa operazione. Inoltre, Microsoft Visual Studio .NET 2005 fornisce un completo supporto della finestra di progettazione, consentendo di visualizzare l'aspetto delle pagine durante la creazione.