Partager via


Propriétés de contrôle serveur, exemple

Mise à jour : novembre 2007

Cet exemple montre comment créer un contrôle nommé Book qui rend persistantes des propriétés simples et des propriétés possédant des sous-propriétés.

Une propriété simple est une propriété dont le type est une chaîne ou un type qui se mappe facilement à une chaîne. Une propriété simple est persistante comme attribut de la balise d'ouverture du contrôle sans que vous ayez à intervenir. Les propriétés de type String et les types valeur primitifs de la bibliothèque de classes .NET Framework, tels que Boolean, Int16, Int32 et Enum, sont des propriétés simples. Vous pouvez ajouter du code pour stocker une propriété simple dans le dictionnaire ViewState afin d'assurer la gestion d'état d'une publication à l'autre.

Une propriété est dite complexe lorsque son type est une classe qui possède elle-même des propriétés, lesquelles sont appelées sous-propriétés. Par exemple, le type de la propriété Font du WebControl est la classe FontInfo, qui possède elle-même des propriétés telles que Bold et Name. Bold et Name sont des sous-propriétés de la propriété Font du WebControl. L'infrastructure de page ASP.NET peut conserver des sous-propriétés sur la balise d'ouverture d'un contrôle à l'aide d'une syntaxe à trait d'union (par exemple, Font-Bold="true"), mais les sous-propriétés sont plus faciles à lire dans la page lorsqu'elles sont persistantes entre les balises du contrôle (par exemple, <font Bold="true">).

Pour permettre à un concepteur visuel de conserver des sous-propriétés en tant qu'enfants du contrôle, vous devez appliquer plusieurs attributs au moment du design à la propriété et à son type ; la persistance s'effectue par défaut à l'aide d'attributs avec trait d'union sur la balise du contrôle. En outre, une propriété qui possède des sous-propriétés nécessite également une gestion d'état personnalisée pour pouvoir utiliser l'état d'affichage, comme le décrit la section « Explication du code » plus loin dans cette rubrique.

Le contrôle Book défini dans l'exemple est un contrôle qui peut éventuellement être utilisé dans une page Web pour afficher des informations sur un carnet dans un catalogue. Le contrôle Book définit les propriétés suivantes :

  • Author, une propriété possédant des sous-propriétés dont le type est le type personnalisé Author. Le type Author possède ses propres propriétés, telles que FirstName et LastName, qui sont des sous-propriétés de la propriété Author.

  • BookType, une propriété simple dont le type est l'énumération personnalisée BookType. L'énumération BookType a des valeurs telles que Fiction et NonFiction

  • CurrencySymbol, une propriété simple dont le type est le type String intégré.

  • Price, une propriété simple dont le type est le type Decimal intégré.

  • Title, une propriété simple dont le type est le type String intégré.

Les propriétés BookType, CurrencySymbol, Price et Title sont toutes des propriétés simples et n'ont donc pas besoin d'attributs spéciaux pour la persistance de page. L'infrastructure de page rend par défaut ces propriétés persistantes comme attributs de la balise du contrôle, comme dans l'exemple suivant :

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

La propriété Author et les propriétés de la classe Author nécessitent des attributs au moment du design pour activer la persistance entre les balises du contrôle, comme le montre l'exemple suivant :

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

Le contrôle Book stocke ses propriétés simples dans le dictionnaire ViewState. Le contrôle Book doit toutefois implémenter la gestion d'état personnalisée pour que la propriété Author puisse gérer l'état de la propriété d'une publication à l'autre.

Une implémentation de qualité de production du contrôle Book pourra définir des propriétés pour d'autres données liées au carnet, comme l'éditeur et la date de publication. De plus, la propriété Author pourra être remplacée par une propriété de collection. Pour plus d'informations sur l'implémentation d'une propriété de collection, consultez Propriété de collection de contrôles Web, exemple.

Remarque :

Un développeur de pages peut désactiver l'état d'affichage d'une page ou d'un contrôle de la page. Si votre contrôle a besoin de maintenir l'état critique d'une publication à l'autre pour son fonctionnement interne, vous pouvez utiliser le mécanisme d'état du contrôle défini dans ASP.NET 2.0. L'état du contrôle est décrit dans Comparaison entre états de contrôle et états d'affichage, exemple.

Liste du code du contrôle 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();
        }

    }
}

Explication du code

DesignerSerializationVisibilityAttribute et PersistenceModeAttribute appliqués à la propriété Author du contrôle Book sont décrits dans Propriété de collection de contrôles Web, exemple. Ces attributs sont nécessaires pour sérialiser et rendre persistantes les propriétés de la classe Author.

Le mécanisme d'état d'affichage se réfère à la technique utilisée par ASP.NET pour conserver l'état d'une publication à l'autre. Ce mécanisme sérialise l'état d'une page et son arborescence de contrôles en représentation sous forme de chaîne à la fin du traitement de la page et désérialise la chaîne lors de la publication. Par défaut, la page transmet les chaînes au navigateur en tant que champs masqués. Pour plus d'informations, consultez Vue d'ensemble de la gestion d'état ASP.NET.

Pour gérer l'état d'une propriété simple, vous devez la définir comme une propriété en lecture/écriture stockée dans la propriété ViewState du contrôle. Le contrôle Book définit ses propriétés simples (BookType, CurrencySymbol, Price et Title) de cette façon. L'état des propriétés que vous stockez dans la propriété ViewState est géré sans aucune intervention de votre part.

Pour gérer une propriété qui possède des sous-propriétés, vous pouvez la définir comme étant en lecture seule et écrire du code pour gérer l'état de l'objet. Pour cela, vous devez substituer les méthodes suivantes :

Le type de la propriété ViewState, StateBag, est un dictionnaire avec gestion d'état intégrée. La classe StateBag implémente l'interface IStateManager, qui définit les méthodes TrackViewState, SaveViewState et LoadViewState. La classe StateBag implémente ces méthodes pour commencer à suivre les modifications apportées aux propriétés de contrôle après l'initialisation, pour enregistrer les éléments modifiés à la fin de la demande de page et pour charger l'état enregistré dans les éléments lors de la publication. StateBag assure le suivi des éléments en les marquant comme étant modifiés s'ils sont définis après que la méthode OnInit a été exécutée pour répondre à une demande de page. Par exemple, si une partie du code de la page qui s'exécute après l'initialisation de celle-ci définit la propriété Title du contrôle Book, une modification est apportée à ViewState["Title"]. La valeur stockée sous la clé "Title" dans ViewState est alors marquée comme modifiée. Pour plus d'informations, consultez Vue d'ensemble du cycle de vie des pages ASP.NET.

Le contrôle Book définit la propriété Author comme étant en lecture seule et implémente la gestion d'état personnalisée comme suit :

  • Dans la méthode TrackViewState, le contrôle Book commence par enregistrer la propriété Author initiale dans une chaîne, puis déclenche le suivi d'état en appelant la méthode TrackViewState de la classe de base.

  • Dans la méthode SaveViewState, le contrôle Book détermine si la propriété Author a dévié de sa valeur initiale. Si la propriété a changé, Book enregistre la propriété Author dans le dictionnaire ViewState à l'aide de la clé "Author". Le contrôle Book appelle ensuite la méthode SaveViewState de la classe de base. Le suivi d'état étant activé, l'objet Author enregistré dans ViewState est marqué automatiquement comme étant modifié et enregistré au sein de l'état d'affichage de la classe de base.

  • Dans LoadViewState, le contrôle Book appelle tout d'abord la méthode LoadViewState de la classe de base. Cet appel restaure automatiquement le dictionnaire ViewState. Le contrôle Book détermine ensuite s'il existe dans le dictionnaire ViewState un élément stocké sous "Author". Si tel est le cas, le contrôle charge la valeur de l'état d'affichage dans la propriété Author.

Le type Author (défini dans la liste de code qui suit) a un convertisseur de type personnalisé pour qu'une instance Author puisse être stockée dans l'état d'affichage. Le convertisseur de type convertit une instance Author en une chaîne et vice-versa. Définir un convertisseur de type permet de définir les sous-propriétés de Author dans un concepteur visuel. Le convertisseur de type personnalisé est décrit dans Convertisseur de type, exemple. Les types que vous pouvez stocker dans l'état d'affichage sont limités par la classe LosFormatter qu'utilise ASP.NET pour la sérialisation de l'état d'affichage. Les types que l'on peut sérialiser le plus efficacement sont String, les types valeur primitifs de la bibliothèque de classes .NET Framework, tels que Boolean, Int16, Int32, Enum, Pair, Triplet, Array, ArrayList et Hashtable, et les types qui contiennent ces types primitifs. De plus, vous pouvez également stocker dans l'état d'affichage les types personnalisés pour lesquels des convertisseurs de type ont été définis, tels que Pair, Triplet, Array, ArrayList et Hashtable. Lorsque vous définissez la sérialisation de l'état d'affichage de votre contrôle, vous devez convertir vos données de contrôle en l'un de ces types. Si vous stockez dans l'état d'affichage des types non compatibles avec le mécanisme de sérialisation de l'état d'affichage, votre contrôle peut être compilé mais générera une erreur au moment de l'exécution. Enfin, les types sérialisables (c'est-à-dire les types qui implémentent l'interface ISerializable ou qui sont marqués avec SerializableAttribute) peuvent être stockés dans l'état d'affichage, mais leur sérialisation est considérablement plus lente que celle des types primitifs.

L'objet d'état fourni par un contrôle pour la sérialisation est l'état d'affichage du contrôle. La propriété ViewState d'un contrôle n'est qu'une partie de l'état d'affichage d'un contrôle. C'est la partie qui participe automatiquement au mécanisme d'état d'affichage sans intervention de votre part. La classe Control implémente la logique servant à enregistrer et charger les éléments modifiés dans le dictionnaire ViewState dans ses méthodes SaveViewState et LoadViewState. L'autre ou les autres parties de l'état d'affichage sont des objets supplémentaires que vous (et la classe de base de votre contrôle) enregistrez dans l'état d'affichage en substituant la méthode SaveViewState. Lorsque vous substituez les méthodes SaveViewState et LoadViewState, vous devez appeler les méthodes correspondantes de la classe de base.

Liste du code de la classe Author

Appliquer NotifyParentPropertyAttribute aux propriétés FirstName, LastName et MiddleName et affecter à l'argument de constructeur de l'attribut la valeur true force un concepteur visuel à propager et à sérialiser les modifications de ces propriétés dans leur propriété parent (une instance de 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);
        }
    }
}

Liste du code de l'énumération 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
    }
}

Page de test du contrôle Book

L'exemple suivant illustre une page .aspx qui utilise le contrôle 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>

Génération et utilisation de l'exemple

Compilez les classes de cet exemple avec la classe AuthorConverter répertoriée dans Convertisseur de type, exemple.

Pour plus d'informations sur la compilation et l'utilisation des exemples de contrôles personnalisés, consultez Exemples de création de contrôles serveur personnalisés.

Voir aussi

Concepts

Types valeur du système de type commun

Référence

IsPrimitive

Autres ressources

Développement de contrôles serveur ASP.NET personnalisés