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(" ")
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(" ");
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:
TrackViewState per richiedere al controllo di avviare la gestione delle modifiche alla proprietà dopo l'inizializzazione.
SaveViewState, per salvare la proprietà, se è variata, alla fine della richiesta della pagina.
LoadViewState, per caricare lo stato salvato nella proprietà durante il postback.
Nota: Oltre al metodo precedentemente illustrato, sono disponibili altri metodi per la gestione dello stato di proprietà complesse. È possibile estendere il metodo utilizzato in Procedura dettagliata: sviluppo e utilizzo di un controllo server personalizzato variando lo stato di visualizzazione ad ogni variazione della proprietà. È possibile inoltre gestire lo stato nella classe della proprietà come illustrato in Esempio di gestione dello stato delle proprietà personalizzate.
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