Condividi tramite


Procedura dettagliata: implementazione di personalizzazioni di Web part con IPersonalizable

Aggiornamento: novembre 2007

In questa procedura dettagliata viene illustrato come fornire valori predefiniti specifici di un utente mediante l'implementazione di un controllo utente come controllo Web part personalizzabile.

La caratteristica più significativa di questo controllo è che le proprietà personalizzabili sono archiviate in variabili che non sono tipi di valori. In questo caso, i valori vengono archiviati in un controllo BulletedList. Il sistema non è pertanto in grado di sapere quando l'utente modifica i valori nell'elenco. In questa procedura dettagliata viene illustrato come informare il sistema della modifica dei valori in modo che possano essere conservati per l'utilizzo futuro. Ciò si può rivelare utile quando si creano form in linea personalizzabili su base utente. La personalizzazione di Web part consente al sistema di riconoscere l'utente in modo che i relativi valori del form vengano automaticamente ripristinati in occasione delle successive visite al sito.

Nota:

Il controllo utente creato in questa procedura dettagliata non eredita dalla classe WebPart; tuttavia, un controllo utente può funzionare come controllo WebPart. Il controllo utente verrà aggiunto a un'area WebPartZoneBase per consentire ad ASP.NET di incapsularlo in un controllo GenericWebPart. Il controllo utente funzionerà quindi come qualsiasi altro controllo WebPart, consentendo di sperimentare la personalizzazione.

In particolare, vengono illustrate le seguenti operazioni:

  • Creazione di un controllo utente con proprietà personalizzabili, i cui valori possono essere salvati in un sistema di memorizzazione a lungo termine.

  • Visualizzazione di valori predefiniti specifici dell'utente.

  • Utilizzo del controllo utente in un'area come se fosse un controllo WebPart.

Nota:

Anche se questo tipo di applicazione potrebbe essere sviluppato utilizzando i profili ASP.NET, in questo caso non è necessario memorizzare informazioni sull'utente da riutilizzare all'interno di un'intera applicazione, ad esempio un'applicazione di carrello degli acquisti, bensì occorre salvare preferenze o impostazioni specifiche di un utente per ogni singolo controllo, pagina per pagina. Per ulteriori informazioni sui profili, vedere Cenni preliminari sulle proprietà dei profili ASP.NET.

Prerequisiti

Per completare questa procedura, è necessario disporre di:

  • Internet Information Services (IIS) installato e configurato sul computer che ospiterà il sito. Per ulteriori informazioni sull'installazione e sulla configurazione di IIS, vedere la Guida di IIS inclusa nel prodotto o la documentazione in linea di IIS disponibile sul sito Microsoft TechNet, Internet Information Services 6.0 Technical Resources (informazioni in lingua inglese).

  • Un sito Web ASP.NET in grado di identificare i singoli utenti. Se un sito di questo tipo è già configurato, è possibile utilizzarlo come punto di partenza per questa procedura dettagliata. In caso contrario, per ulteriori informazioni sulla creazione di una directory o un sito virtuale, vedere Procedura: creare e configurare directory virtuali in IIS 5.0 e 6.0.

  • Un database e un provider di personalizzazioni configurati. La personalizzazione di Web part è attivata per impostazione predefinita e utilizza il provider di personalizzazioni SQL (SqlPersonalizationProvider) con Microsoft SQL Server Standard Edition (SSE) per l'archiviazione dei dati di personalizzazione. In questa procedura dettagliata vengono utilizzati SSE e il provider SQL predefinito. Se SSE è già installato non è necessaria alcuna configurazione. SSE è disponibile con Microsoft Visual Studio 2005 come parte facoltativa dell'installazione oppure può essere scaricato gratuitamente dal sito Microsoft.com. Per utilizzare una delle versioni complete di SQL Server, è necessario installare e configurare un database dei servizi dell'applicazione ASP.NET e configurare il provider di personalizzazioni SQL per la connessione a tale database. Per ulteriori informazioni, vedere Creazione e configurazione del database dei servizi dell'applicazione per SQL Server. È inoltre possibile creare e configurare un provider personalizzato da utilizzare con altri database o soluzioni di memorizzazione non basati su SQL. Per ulteriori informazioni e un esempio di codice, vedere Implementazione di un provider di appartenenze.

Creazione di un controllo utente personalizzabile che contiene variabili di tipo riferimento

In questa parte della procedura dettagliata verrà creato un controllo utente che consente di immettere un URL e un nome descrittivo per un sito Web. Quando si fa clic sul pulsante Save, il nome descrittivo viene aggiunto a un controllo BulletedList. Questi valori vengono archiviati dalla funzionalità di personalizzazione di Web part su base utente. Ogni volta che l'utente accede al controllo da un'altra pagina o in una nuova sessione, il sistema visualizza i valori BulletedList salvati.

Nota:

Non è necessario attivare la personalizzazione di Web part, poiché è già attivata per impostazione predefinita. Per ulteriori informazioni sulla personalizzazione, vedere Cenni preliminari sulla personalizzazione di Web part.

Per creare il controllo utente personalizzabile

  1. In un editor di testo creare un nuovo file in cui includere il controllo utente, assegnargli il nome UrlList.ascx e salvarlo nella directory Web. Il codice che implementa il comportamento del controllo è contenuto in un file separato, come illustrato nel passaggio 4.

  2. Nel nuovo file aggiungere una direttiva @Control nel linguaggio di programmazione in uso, come illustrato nell'esempio seguente.

    <%@ Control Language="VB" AutoEventWireup="false"  
    CodeFile="UrlList.ascx.vb" Inherits="WebParts_UrlList" %>
    
    <%@ Control Language="C#" AutoEventWireup="true" 
    CodeFile="UrlList.ascx.cs" Inherits="WebParts_UrlList" %>
    
  3. Sotto la direttiva aggiungere gli elementi seguenti per rappresentare l'interfaccia utente del controllo.

    <table>
    
    <tr>
        <td> 
            <asp:Label ID="NameLabelID" Text="Name: "  />
        </td>
        <td>
            <asp:TextBox ID="NameTextBoxID"  />
        </td>
    </tr>
    
    <tr>
        <td>
            <asp:Label ID="UrlLabelID1" Text="Url:  "  />
        </td>
        <td>
            <asp:TextBox ID="UrlTextBoxID"  />
        </td>
    </tr>
    
    <tr>
        <td>
            <asp:Button ID="SaveID"  
                OnClick="SaveButton_Click" Text="Save" />
        </td>
        <td>
            <asp:Button ID="ResetID"  
                OnClick="ResetButton_Click" Text="Reset" />
        </td>
    </tr>
    
    </table>
    
    <div>
         // This is the complex variable whose status 
         // must be preserved.
        <asp:BulletedList 
            ID="BulletedListID" 
            DisplayMode="HyperLink"  Target="_blank" />
    
    </div>
    
  4. Creare un altro file che funga da file complementare e aggiungervi il codice seguente. Nell'esempio riportato di seguito è rappresentato il file complementare (UrlList.ascx.vb o UrlList.ascx.cs, a seconda del linguaggio utilizzato) che implementa il comportamento del controllo UrlList.ascx precedente. Questo codice è diviso in due parti. Una parte contiene il codice che gestisce l'input utente e l'evento di caricamento della pagina; l'altra contiene il codice che implementa l'interfaccia IPersonalizable. In questo modo, i valori BulletedList vengono conservati, ovvero si garantisce la personalizzazione del controllo utente. In questo esempio vengono implementati i membri di interfaccia Load, Save e IsDirty.

    ' UrlList.ascx.vb
    Imports System
    Imports System.Collections
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    
    Partial Class WebParts_VB_UrlList
        Inherits System.Web.UI.UserControl
        Implements IPersonalizable
    
        Private _userUrls As ArrayList
        Private _listDirty As Boolean
    
        ' This code implements the IPersonalizable members.
    
        Public Overridable ReadOnly Property IsDirty() As Boolean _
        Implements System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty
    
            Get
                Return _listDirty
            End Get
        End Property
    
    
        Public Overridable Shadows Sub Load(ByVal state As PersonalizationDictionary) _
        Implements System.Web.UI.WebControls.WebParts.IPersonalizable.Load
    
    
            If Not (state Is Nothing) Then
    
                Dim userUrlsEntry As PersonalizationEntry = state("userUrls")
                If Not (userUrlsEntry Is Nothing) Then
                    _userUrls = CType(userUrlsEntry.Value, ArrayList)
                End If
            End If
    
        End Sub 'Load
    
        Public Overridable Sub Save(ByVal state As PersonalizationDictionary) _
          Implements System.Web.UI.WebControls.WebParts.IPersonalizable.Save
    
            If Not (_userUrls Is Nothing) AndAlso _userUrls.Count <> 0 Then
                state("userUrls") = New PersonalizationEntry(_userUrls, _
                PersonalizationScope.User)
            End If
    
        End Sub
    
        ' This code handles the user's input.
        Protected Sub SaveButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs)
    
            Dim name As String = NameTextBoxID.Text.Trim()
            Dim url As String = UrlTextBoxID.Text.Trim()
    
            Dim p As New Pair(name, url)
    
            If _userUrls Is Nothing Then
                _userUrls = New ArrayList()
            End If
            _userUrls.Add(p)
    
            BulletedListID.Items.Add(New ListItem(CStr(p.First), _
            CStr(p.Second)))
    
            _listDirty = True
    
        End Sub 'SaveButton_Click
    
    
        Protected Sub ResetButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs)
    
            _userUrls = New ArrayList()
    
             BulletedListID.Items.Clear()
    
            _listDirty = True
    
        End Sub 'ResetButton_Click 
    
    
        Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As EventArgs)
            If Not (_userUrls Is Nothing) Then
                BulletedListID.Items.Clear()
                Dim p As Pair
                For Each p In _userUrls
                    BulletedListID.Items.Add(New _
                    ListItem(CStr(p.First), CStr(p.Second)))
                Next p
            End If
    
        End Sub 'Page_Load
    
    End Class
    
    // UrlList.ascx.cs
    using System;
    using System.Collections;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    
    public partial class WebParts_UrlList : System.Web.UI.UserControl, 
        IPersonalizable
    {
        private ArrayList _userUrls;
        private bool _listDirty;
    
           // This code implements the IPersonalizable members.
    
        public new void Load(PersonalizationDictionary state)
        {
            if (state != null)
            {
    
                PersonalizationEntry userUrlsEntry = state["userUrls"];
                if (userUrlsEntry != null)
                {
                    _userUrls = (ArrayList)userUrlsEntry.Value;
                }
    
            }
        }
    
        public void Save(PersonalizationDictionary state)
        {
    
            if ((_userUrls != null) && (_userUrls.Count != 0))
            {
                state["userUrls"] =
                    new PersonalizationEntry(_userUrls, PersonalizationScope.User);
            }
    
        }
    
        public virtual bool IsDirty
        {
            get
            {
                return _listDirty;
            }
        }
    
           // This code handles the user's input.
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (_userUrls != null)
            {
                BulletedListID.Items.Clear();
                foreach (Pair p in _userUrls)
                {
                    BulletedListID.Items.Add(
                        new ListItem((string)p.First, (string)p.Second));
                }
            }
    
        }
    
        protected void SaveButton_Click(object sender, EventArgs e)
        {
            string name = NameTextBoxID.Text.Trim();
            string url = UrlTextBoxID.Text.Trim();
    
            Pair p = new Pair(name, url);
    
            if (_userUrls == null)
            {
                _userUrls = new ArrayList();
            }
            _userUrls.Add(p);
    
            BulletedListID.Items.Add(
                    new ListItem((string)p.First, (string)p.Second));
    
            _listDirty = true;
        }
    
    
        protected void ResetButton_Click(object sender, EventArgs e)
        {
    
            _userUrls = new ArrayList();
    
             BulletedListID.Items.Clear();
    
            _listDirty = true;
    
        }
    
    } 
    
  5. Denominare il file UrlList.ascx.vb o UrlList.ascx.cs (a seconda del linguaggio utilizzato) e salvarlo nella directory principale del sito Web.

    Nota sulla sicurezza:

    Il controllo include una casella di testo che accetta l'input dell'utente e rappresenta quindi una potenziale minaccia alla sicurezza. L'input dell'utente in una pagina Web potrebbe infatti contenere script client dannosi. Per impostazione predefinita, le pagine Web ASP.NET verificano che l'input dell'utente non includa script o elementi HTML. Se questa convalida è attivata, non occorrerà effettuare un controllo esplicito per escludere che l'input utente contenga script o elementi HTML. Per ulteriori informazioni, vedere Cenni preliminari sugli attacchi tramite script.

Riferimento al controllo utente come a un controllo Web part

Una volta creato un controllo utente con proprietà personalizzabili, è possibile creare una pagina Web Form che contenga il controllo utente come controllo Web part.

Nota:

Affinché la personalizzazione funzioni il controllo deve essere inserito come controllo Web part.

Per fare riferimento al controllo utente come a un controllo Web part

  1. Creare un nuovo file in un editor di testo. Aggiungere una dichiarazione di pagina all'inizio del file, come illustrato nell'esempio seguente.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Sotto la dichiarazione di pagina, aggiungere una dichiarazione in cui si fa riferimento al controllo utente creato in precedenza, come illustrato nell'esempio riportato di seguito.

    <%@ Register tagprefix="UserControl" tagname="UrlList" 
    src="UrlList.ascx" %>
    
    <%@ Register tagprefix="UserControl" tagname="UrlList" 
    src="UrlList.ascx" %>
    
  3. Sotto il riferimento al controllo, aggiungere la seguente struttura di pagina di base per aggiungere il controllo utente come controllo Web part.

    Nota:

    Affinché il controllo utente funzioni come controllo Web part, la pagina deve contenere un elemento <asp:webpartmanager> e il controllo utente deve essere contenuto all'interno di un elemento <asp:webpartzone> e di un elemento <zonetemplate> in successione, come illustrato nell'esempio riportato di seguito.

    <html>
    <head >
        <title>Personalizable User Control</title>
    </head>
    <body>
        <form id="form1" >
          <asp:WebPartManager ID="mgr"  />
            <div>
              <asp:WebPartZone ID="WebPartZone1" >
                <ZoneTemplate>
                  < UserControl:UrlList ID="AccUserID" 
                    title="URL List WebPart" />  
                </ZoneTemplate>
              </asp:WebPartZone>
            </div>    
        </form>
    </body>
    </html>
    
  4. Denominare il file UrlList.aspx e salvarlo nella stessa directory del controllo utente.

    A questo punto è stato creato un controllo utente personalizzabile a cui viene fatto riferimento come a un controllo Web part in una pagina Web Form.

Il passaggio finale consiste nell'eseguire il test del controllo utente.

Per eseguire il test del controllo utente personalizzabile

  1. Caricare la pagina UrlList.aspx in un browser.

  2. Immettere valori nei campi Name e URL, quindi fare clic sul pulsante Save Form Values.

  3. Chiudere il browser.

  4. Caricare di nuovo la pagina in un browser.

    I valori immessi in precedenza verranno automaticamente visualizzati nel form. Si tratta dei valori salvati nel controllo BulletedList e ripristinati dal database quando la pagina è stata ricaricata nel browser.

  5. Immettere nuovi valori nel form senza fare clic sul pulsante per salvarli. Chiudere il browser.

  6. Caricare di nuovo la pagina in un browser. Nel form verranno visualizzati i valori originali immessi e salvati nelle proprietà personalizzabili.

Passaggi successivi

In questa procedura dettagliata sono state illustrate le operazioni principali da eseguire per creare un controllo utente con proprietà personalizzabili. È stato creato un controllo che consente di salvare impostazioni specifiche di un utente per un determinato controllo di una determinata pagina e di visualizzare le impostazioni salvate alla successiva visita della pagina da parte dell'utente in una nuova sessione del browser. Di seguito vengono forniti suggerimenti per un'ulteriore analisi:

Vedere anche

Concetti

Cenni preliminari su Web part ASP.NET

Cenni preliminari sulla personalizzazione di Web part