Condividi tramite


Esempio di proprietà dei controlli server

Aggiornamento: novembre 2007

Nell'esempio seguente vengono illustrate le modalità di creazione di un controllo denominato Book che mantiene proprietà semplici e proprietà con sottoproprietà.

Una proprietà semplice è una proprietà il cui tipo è una stringa o un tipo che esegue facilmente il mapping a una stringa. Una proprietà semplice viene mantenuta sotto forma di attributo nei tag di apertura del controllo, senza attività aggiuntive. Le proprietà del tipo String e i tipi di valore primitivi nella libreria delle classi .NET Framework, quali Boolean, Int16, Int32 e Enum, sono proprietà semplici. È possibile aggiungere codice per archiviare una proprietà semplice nel dizionario ViewState per la gestione dello stato attraverso i postback.

Una proprietà viene definita complessa quando il tipo della proprietà è una classe che, a sua volta, presenta proprietà, che vengono definite sottoproprietà. Ad esempio, il tipo della proprietà Font di WebControl è la classe FontInfo che ha a sua volta proprietà quali Bold e Name. Bold e Name sono sottoproprietà della proprietà Font di WebControl. Il framework della pagina ASP.NET può mantenere le sottoproprietà in un tag di apertura del controllo con trattini, ad esempio Font-Bold="true", ma la leggibilità delle sottoproprietà della pagina migliora se sono mantenute incluse nei tag del controllo, ad esempio <font Bold="true">.

Per permettere alla finestra di progettazione visiva di mantenere le sottoproprietà come elementi figlio del controllo, è necessario applicare vari attributi in fase di progettazione alla proprietà e al tipo. La persistenza predefinita prevede attributi con trattino nel tag del controllo. Inoltre, una proprietà con sottoproprietà richiede una gestione personalizzata dello stato per utilizzare lo stato di visualizzazione come descritto nella sezione "Illustrazione del codice" più avanti in questo argomento.

Il controllo Book definito nell'esempio è un controllo utilizzabile in una pagina Web per visualizzare informazioni relative a un libro in un catalogo. Il controllo Book definisce le proprietà seguenti:

  • Author, una proprietà con sottoproprietà il cui tipo è il tipo personalizzato Author. Il tipo Author presenta proprietà quali FirstName e LastName, che sono sottoproprietà della proprietà Author.

  • BookType, una proprietà semplice il cui tipo è l'enumerazione personalizzata BookType. L'enumerazione BookType presenta valori quali Fiction e NonFiction.

  • CurrencySymbol, una proprietà semplice il cui tipo è il tipo String incorporato.

  • Price, una proprietà semplice il cui tipo è il tipo Decimal incorporato.

  • Title, una proprietà semplice il cui tipo è il tipo String incorporato.

Le proprietà BookType, CurrencySymbol, Price e Title sono proprietà semplici e non richiedono quindi attributi speciali per la persistenza della pagina. Il framework della pagina mantiene queste proprietà, per impostazione predefinita, come attributi nel tag del controllo, come illustrato nell'esempio seguente.

<aspSample:Book Title="Wingtip Toys Stories" 
  CurrencySymbol="$" 
  Price="16" 
  BookType="Fiction">
</aspSample:Book>

La proprietà Author e le proprietà della classe Author richiedono attributi in fase di progettazione per attivare la persistenza entro i tag del controllo, come illustrato nell'esempio seguente.

<aspSample:Book >
  <Author FirstName="Judy" LastName="Lew" />
</aspSample:Book>

Il controllo Book archivia le proprietà semplici nel dizionario ViewState. Tuttavia, il controllo Book deve implementare la gestione personalizzata dello stato per la proprietà Author per gestire lo stato della proprietà con postback.

Un'implementazione in produzione del controllo Book dovrebbe definire le proprietà degli altri dati correlati ai libri, quali l'editore e la data di pubblicazione. Inoltre, la proprietà Author potrebbe essere sostituita con una proprietà dell'insieme. Per informazioni sull'implementazione della proprietà dell'insieme, vedere Esempio di proprietà Collection di Web Control.

Nota:

Uno sviluppatore di pagine può disattivare lo stato di visualizzazione per una pagina o per controlli individuali nella pagina. Se il controllo deve mantenere lo stato critico nei diversi postback per il funzionamento interno, è possibile utilizzare il meccanismo dello stato del controllo definito in ASP.NET 2.0. Lo stato del controllo è descritto in Esempio di confronto tra stato del controllo e stato di visualizzazione.

Listato di codice per il controllo Book

' Book.vb
Option Strict On
Imports System
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace Samples.AspNet.VB.Controls
    < _
    AspNetHostingPermission(SecurityAction.Demand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    AspNetHostingPermission(SecurityAction.InheritanceDemand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    DefaultProperty("Title"), _
    ToolboxData("<{0}:Book runat=""server""> </{0}:Book>") _
    > _
    Public Class Book
        Inherits WebControl
        Private authorValue As Author
        Private initialAuthorString As String

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The name of the author."), _
        DesignerSerializationVisibility( _
            DesignerSerializationVisibility.Content), _
        PersistenceMode(PersistenceMode.InnerProperty) _
        > _
        Public Overridable ReadOnly Property Author() As Author
            Get
                If (authorValue Is Nothing) Then
                    authorValue = New Author()
                End If
                Return authorValue
            End Get
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(BookType.NotDefined), _
        Description("Fiction or Not") _
        > _
        Public Overridable Property BookType() As BookType
            Get
                Dim t As Object = ViewState("BookType")
                If t Is Nothing Then t = BookType.NotDefined
                Return CType(t, BookType)
            End Get
            Set(ByVal value As BookType)
                ViewState("BookType") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The symbol for the currency."), _
        Localizable(True) _
        > _
        Public Overridable Property CurrencySymbol() As String
            Get
                Dim s As String = CStr(ViewState("CurrencySymbol"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("CurrencySymbol") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue("0.00"), _
        Description("The price of the book."), _
        Localizable(True) _
        > _
        Public Overridable Property Price() As Decimal
            Get
                Dim p As Object = ViewState("Price")
                If p Is Nothing Then p = Decimal.Zero
                Return CType(p, Decimal)
            End Get
            Set(ByVal value As Decimal)
                ViewState("Price") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The title of the book."), _
        Localizable(True) _
        > _
        Public Overridable Property Title() As String
            Get
                Dim s As String = CStr(ViewState("Title"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("Title") = value
            End Set
        End Property

        Protected Overrides Sub RenderContents( _
            ByVal writer As HtmlTextWriter)
            writer.RenderBeginTag(HtmlTextWriterTag.Table)

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(Title)
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(Author.ToString())
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(BookType.ToString())
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.Write(CurrencySymbol)
            writer.Write("&nbsp")
            writer.Write(String.Format("{0:F2}", Price))
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderEndTag()
        End Sub

        Protected Overrides Sub LoadViewState( _
            ByVal savedState As Object)
            MyBase.LoadViewState(savedState)
            Dim auth As Author = CType(ViewState("Author"), Author)
            If auth IsNot Nothing Then
                authorValue = auth
            End If
        End Sub

        Protected Overrides Function SaveViewState() As Object
            If authorValue IsNot Nothing Then
                Dim currentAuthorString As String = _
                    authorValue.ToString()
                If Not _
                    (currentAuthorString.Equals(initialAuthorString)) Then
                    ViewState("Author") = authorValue
                End If
            End If
            Return MyBase.SaveViewState()
        End Function

        Protected Overrides Sub TrackViewState()
            If authorValue IsNot Nothing Then
                initialAuthorString = authorValue.ToString()
            End If
            MyBase.TrackViewState()
        End Sub

    End Class
End Namespace
// Book.cs
using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Samples.AspNet.CS.Controls
{
    [
    AspNetHostingPermission(SecurityAction.Demand,
        Level = AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand, 
        Level=AspNetHostingPermissionLevel.Minimal),
    DefaultProperty("Title"),
    ToolboxData("<{0}:Book runat=\"server\"> </{0}:Book>")
    ]
    public class Book : WebControl
    {
        private Author authorValue;
        private String initialAuthorString;

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The name of the author."),
        DesignerSerializationVisibility(
            DesignerSerializationVisibility.Content),
        PersistenceMode(PersistenceMode.InnerProperty),
        ]
        public virtual Author Author
        {
            get
            {
                if (authorValue == null)
                {
                    authorValue = new Author();
                }
                return authorValue;
            }

        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(BookType.NotDefined),
        Description("Fiction or Not"),
        ]
        public virtual BookType BookType
        {
            get
            {
                object t = ViewState["BookType"];
                return (t == null) ? BookType.NotDefined : (BookType)t;
            }
            set
            {
                ViewState["BookType"] = value;
            }
        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The symbol for the currency."),
        Localizable(true)
        ]
        public virtual string CurrencySymbol
        {
            get
            {
                string s = (string)ViewState["CurrencySymbol"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["CurrencySymbol"] = value;
            }
        }


        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue("0.00"),
        Description("The price of the book."),
        Localizable(true)
        ]
        public virtual Decimal Price
        {
            get
            {
                object price = ViewState["Price"];
                return (price  == null) ? Decimal.Zero : (Decimal)price;
            }
            set
            {
                ViewState["Price"] = value;
            }
        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The title of the book."),
        Localizable(true)
        ]
        public virtual string Title
        {
            get
            {
                string s = (string)ViewState["Title"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Title"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Table);

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(Title);
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(Author.ToString());
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(BookType.ToString());
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(CurrencySymbol);
            writer.Write("&nbsp;");
            writer.Write(String.Format("{0:F2}", Price));
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderEndTag();
        }

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            Author auth = (Author)ViewState["Author"];
            if (auth != null)
            {
                authorValue = auth;
            }
        }

        protected override object SaveViewState()
        {
            if (authorValue != null)
            {
                String currentAuthorString = authorValue.ToString();
                if (!(currentAuthorString.Equals(initialAuthorString)))
                {
                    ViewState["Author"] = authorValue;
                }
            }

            return base.SaveViewState();
        }

        protected override void TrackViewState()
        {
            if (authorValue != null)
            {
                initialAuthorString = authorValue.ToString();
            }
            base.TrackViewState();
        }

    }
}

Illustrazione del codice

Gli attributi DesignerSerializationVisibilityAttribute e PersistenceModeAttribute applicati alla proprietà Author del controllo Book sono descritti in Esempio di proprietà Collection di Web Control. Questi attributi sono necessari per serializzare e mantenere le proprietà della classe Author.

Il meccanismo dello stato di visualizzazione fa riferimento alla tecnica che ASP.NET utilizza per mantenere lo stato attraverso i postback. Il meccanismo serializza lo stato della pagina e della struttura del controllo con rappresentazioni in formato stringa al termine dell'elaborazione della pagina e deserializza la stringa nel postback. Per impostazione predefinita, la pagina invia le stringhe al browser sotto forma di campi nascosti. Per ulteriori informazioni, vedere Cenni preliminari sulla gestione dello stato ASP.NET.

Per gestire lo stato di una proprietà semplice è necessario definirla come proprietà di lettura/scrittura archiviata nella proprietà ViewState del controllo. Il controllo Book definisce le proprietà semplici, BookType, CurrencySymbol, Price e Title in questo modo. Lo stato delle proprietà archiviate nella proprietà ViewState viene gestito senza operazioni aggiuntive.

Per gestire una proprietà con sottoproprietà, è possibile definire la proprietà come di sola lettura e scrivere il codice per gestire lo stato dell'oggetto. A tale scopo è necessario eseguire l'override dei metodi seguenti:

Il tipo della proprietà ViewState, StateBag, è un dizionario con gestione incorporata dello stato. La classe StateBag implementa l'interfaccia IStateManager che definisce i metodi TrackViewState, SaveViewState e LoadViewState. La classe StateBag implementa questi metodi per avviare la gestione delle variazioni delle proprietà del controllo dopo l'inizializzazione, salva gli elementi che sono stati modificati al completamento della richiesta della pagina e carica lo stato salvato negli elementi durante il postback. StateBag gestisce gli elementi contrassegnandoli come modificati se sono impostati dopo l'esecuzione del metodo OnInit per una richiesta della pagina. Ad esempio, se il codice nella pagina in esecuzione dopo l'inizializzazione della pagina imposta la proprietà Title del controllo Book, viene modificato in ViewState["Title"]. Quindi, il valore archiviato nella chiave "Title" in ViewState viene contrassegnato come modificato. Per ulteriori informazioni, vedere Cenni preliminari sul ciclo di vita di una pagina ASP.NET.

Il controllo Book definisce la proprietà Author come di sola lettura e implementa una gestione personalizzata dello stato, come descritto di seguito:

  • Nel metodo TrackViewState, il controllo Book salva prima la proprietà iniziale Author in una stringa e poi avvia la gestione dello stato chiamando il metodo TrackViewState della classe base.

  • Nel metodo SaveViewState, il controllo Book determina se la proprietà Author è variata rispetto al valore iniziale. In questo caso, Book salva la proprietà Author nel dizionario ViewState utilizzando la chiave "Author". Il controllo Book richiama quindi il metodo SaveViewState della classe base. Poiché la gestione dello stato è attiva, l'oggetto Author salvato in ViewState viene automaticamente contrassegnato come modificato e salvato come parte dello stato di visualizzazione della classe base.

  • In LoadViewState, il controllo Book chiama prima il metodo LoadViewState della classe base. Questa chiamata ripristina automaticamente il dizionario ViewState. Il controllo Book determina quindi se nel dizionario ViewState è presente un elemento archiviato in "Author". In questo caso, il controllo carica il valore dello stato di visualizzazione nella proprietà Author.

Il tipo Author, definito nel listato di codice riportato più avanti, ha un convertitore di tipi personalizzato per poter archiviare un'istanza Author nello stato di visualizzazione. Il convertitore di tipi converte un'istanza Author in una stringa e viceversa. La definizione di un convertitore di tipi consente di impostare le sottoproprietà di Author nella progettazione visiva. Il convertitore di tipi personalizzato viene descritto in Esempio di convertitore di tipi. I tipi archiviabili nello stato di visualizzazione sono limitati dalla classe LosFormatter che ASP.NET utilizza per serializzare lo stato di visualizzazione. I tipi serializzati in modo efficace sono String; tipi primitivi di valore nella libreria delle classi .NET Framework, quali Boolean, Int16, Int32, Enum, Pair, Triplet, Array, ArrayList, Hashtable e qualsiasi tipo che contiene tutti questi tipi primitivi. Inoltre è possibile archiviare nello stato di visualizzazione tipi personalizzati con convertitori di tipi appositamente definiti, quali Pair, Triplet, Array, ArrayList e Hashtable. Durante la definizione della serializzazione dello stato di visualizzazione per il controllo, è necessario convertire i dati del controllo in uno di questi tipi. Se nello stato di visualizzazione vengono archiviati tipi non compatibili con il meccanismo di serializzazione dello stato di visualizzazione, il controllo può eseguire la compilazione ma genererà un errore in fase di esecuzione. I tipi serializzabili, ovvero i tipi che implementano l'interfaccia ISerializable o sono contrassegnati con SerializableAttribute, possono essere archiviati nello stato di visualizzazione, ma la loro serializzazione richiede molto più tempo rispetto al caso dei tipi primitivi.

L'oggetto dello stato fornito da un controllo per la serializzazione è lo stato di visualizzazione del controllo. La proprietà ViewState di un controllo è solo una parte dello stato di visualizzazione di un controllo. È la parte che contribuisce automaticamente al meccanismo dello stato di visualizzazione senza attività aggiuntive. La classe Control implementa la logica per salvare e caricare gli elementi modificati nel dizionario ViewState nei metodi SaveViewState e LoadViewState. Le altre parti dello stato di visualizzazione sono oggetti aggiuntivi che vengono salvati dallo sviluppatore o dalla classe base del controllo nello stato di visualizzazione, eseguendo l'override del metodo SaveViewState. Durante l'override dei metodi SaveViewState e LoadViewState, è necessario chiamare i metodi corrispondenti della classe base.

Listato di codice per la classe Author

L'applicazione di NotifyParentPropertyAttribute alle proprietà FirstName, LastName e MiddleName e l'impostazione dell'argomento del costruttore dell'attributo su true richiedono alla progettazione visiva la propagazione e la serializzazione delle variazioni di queste proprietà nella proprietà padre, ovvero un'istanza Author.

' Author.vb
Option Strict On
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Globalization
Imports System.Web.UI

Namespace Samples.AspNet.VB.Controls
    < _
    TypeConverter(GetType(AuthorConverter)) _
    > _
    Public Class Author
        Dim firstNameValue As String
        Dim lastNameValue As String
        Dim middleNameValue As String

        Public Sub New()
            Me.New(String.Empty, String.Empty, String.Empty)
        End Sub

        Public Sub New(ByVal firstname As String, _
            ByVal lastname As String)
            Me.New(firstname, String.Empty, lastname)
        End Sub

        Public Sub New(ByVal firstname As String, _
            ByVal middlename As String, ByVal lastname As String)
            firstNameValue = firstname
            middleNameValue = middlename
            lastNameValue = lastname
        End Sub

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("First name of author."), _
        NotifyParentProperty(True) _
        > _
        Public Overridable Property FirstName() As String
            Get
                Return firstNameValue
            End Get
            Set(ByVal value As String)
                firstNameValue = value
            End Set
        End Property


        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Last name of author."), _
        NotifyParentProperty(True) _
        > _
        Public Overridable Property LastName() As String
            Get
                Return lastNameValue
            End Get
            Set(ByVal value As String)
                lastNameValue = value
            End Set
        End Property

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Middle name of author."), _
            NotifyParentProperty(True) _
        > _
        Public Overridable Property MiddleName() As String
            Get
                Return middleNameValue
            End Get
            Set(ByVal value As String)
                middleNameValue = value
            End Set
        End Property

        Public Overrides Function ToString() As String
            Return ToString(CultureInfo.InvariantCulture)
        End Function

        Public Overloads Function ToString( _
            ByVal culture As CultureInfo) As String
            Return TypeDescriptor.GetConverter( _
                Me.GetType()).ConvertToString(Nothing, culture, Me)
        End Function
    End Class
End Namespace
// Author.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Globalization;
using System.Web.UI;

namespace Samples.AspNet.CS.Controls
{
    [
    TypeConverter(typeof(AuthorConverter))
    ]
    public class Author
    {
        private string firstnameValue;
        private string lastnameValue;
        private string middlenameValue;

        public Author()
            :
            this(String.Empty, String.Empty, String.Empty)
        {
        }

        public Author(string firstname, string lastname)
            :
            this(firstname, String.Empty, lastname)
        {
        }

        public Author(string firstname, 
                    string middlename, string lastname)
        {
            firstnameValue = firstname;
            middlenameValue = middlename;
            lastnameValue = lastname;
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("First name of author."),
        NotifyParentProperty(true),
        ]
        public virtual String FirstName
        {
            get
            {
                return firstnameValue;
            }
            set
            {
                firstnameValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Last name of author."),
        NotifyParentProperty(true)
        ]
        public virtual String LastName
        {
            get
            {
                return lastnameValue;
            }
            set
            {
                lastnameValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Middle name of author."),
        NotifyParentProperty(true)
        ]
        public virtual String MiddleName
        {
            get
            {
                return middlenameValue;
            }
            set
            {
                middlenameValue = value;
            }
        }

        public override string ToString()
        {
            return ToString(CultureInfo.InvariantCulture);
        }

        public string ToString(CultureInfo culture)
        {
            return TypeDescriptor.GetConverter(
                GetType()).ConvertToString(null, culture, this);
        }
    }
}

Listato di codice per l'enumerazione BookType

' BookType.vb
Option Strict On
Imports System

Namespace Samples.AspNet.VB.Controls
    Public Enum BookType
        NotDefined = 0
        Fiction = 1
        NonFiction = 2
    End Enum
End Namespace
// BookType.cs
using System;

namespace Samples.AspNet.CS.Controls
{
    public enum BookType
    {
        NotDefined = 0,
        Fiction = 1,
        NonFiction = 2
    }
}

Pagina di prova per il controllo Book

Nell'esempio seguente viene illustrata una pagina ASPX che utilizza il controllo Book.

<%@ Page Language="C#" Debug="true" Trace="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  void Button_Click(object sender, EventArgs e)
  {
    Book1.Author.FirstName = "Bob";
    Book1.Author.LastName = "Kelly";
    Book1.Title = "Contoso Stories";
    Book1.Price = 39.95M;
    Button1.Visible = false;
  }  
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" >
    <title>
      Book test page
    </title>
  </head>
  <body>
    <form id="Form1" >
      <aspSample:Book ID="Book1" Runat="server"  
        Title="Tailspin Toys Stories" CurrencySymbol="$" 
        BackColor="#FFE0C0" Font-Names="Tahoma" 
        Price="16" BookType="Fiction">
        <Author FirstName="Judy" LastName="Lew" />
      </aspSample:Book>
      <br />
      <asp:Button ID="Button1" OnClick="Button_Click" 
        Runat="server" Text="Change" />
      <asp:Button ID="Button2" Runat="server" Text="Refresh" />
      <br />
      <br />
      <asp:HyperLink ID="Hyperlink1" href="BookTest.aspx" 
        Runat="server">
        Reload Page</asp:HyperLink>
    </form>
  </body>
</html>

Generazione e utilizzo dell'esempio

Compilare le classi in questo esempio con la classe AuthorConverter elencata in Esempio di convertitore di tipi.

Per informazioni sulla compilazione e sull'utilizzo degli esempi di controlli personalizzati, vedere Generazione degli esempi dei controlli server personalizzati.

Vedere anche

Concetti

Tipi di valore nel sistema di tipi comuni

Riferimenti

IsPrimitive

Altre risorse

Sviluppo di controlli server ASP.NET personalizzati