ITrackingPersonalizable Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Consente ai controlli Web part di tenere traccia delle fasi specifiche del processo di caricamento e salvataggio delle personalizzazioni.
public interface class ITrackingPersonalizable
public interface ITrackingPersonalizable
type ITrackingPersonalizable = interface
Public Interface ITrackingPersonalizable
- Derivato
Esempio
Nell'esempio di codice seguente viene illustrato l'uso ITrackingPersonalizable di metodi e proprietà per tenere traccia del caricamento e del salvataggio delle informazioni di personalizzazione. L'esempio è costituito da due parti, una pagina .aspx e un file da inserire in una sottodirectory App_Code.
Nell'esempio di codice seguente viene creato un controllo Web part che consente a un utente di immettere le informazioni sull'URL e di salvare queste informazioni per l'utente.
namespace PersTest
{
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public class UrlListWebPart : WebPart, IPersonalizable
{
private ArrayList _sharedUrls;
private ArrayList _userUrls;
private bool _listDirty;
private TextBox _nameTextBox;
private TextBox _urlTextBox;
private Button _addButton;
private BulletedList _list;
public override string Subtitle
{
get
{
return Text;
}
}
[Personalizable, WebBrowsable]
public virtual string Text
{
get
{
object o = ViewState["Text"];
return (o != null) ? (String)o : "My Links";
}
set
{
ViewState["Text"] = value;
}
}
protected override void CreateChildControls()
{
Label nameLabel = new Label();
Label urlLabel = new Label();
LiteralControl breakLiteral1 = new LiteralControl("<br />");
LiteralControl breakLiteral2 = new LiteralControl("<br />");
LiteralControl breakLiteral3 = new LiteralControl("<br />");
_nameTextBox = new TextBox();
_urlTextBox = new TextBox();
_addButton = new Button();
_list = new BulletedList();
nameLabel.Text = "Name: ";
urlLabel.Text = "URL: ";
_nameTextBox.ID = "nameTextBox";
_urlTextBox.ID = "urlTextBox";
_addButton.Text = "Add";
_addButton.ID = "addButton";
_addButton.Click += new EventHandler(this.OnClickAddButton);
_list.DisplayMode = BulletedListDisplayMode.HyperLink;
_list.ID = "list";
Controls.Add(nameLabel);
Controls.Add(_nameTextBox);
Controls.Add(breakLiteral1);
Controls.Add(urlLabel);
Controls.Add(_urlTextBox);
Controls.Add(breakLiteral2);
Controls.Add(_addButton);
Controls.Add(breakLiteral3);
Controls.Add(_list);
}
private void OnClickAddButton(object sender, EventArgs e)
{
string name = _nameTextBox.Text.Trim();
string url = _urlTextBox.Text.Trim();
Pair p = new Pair(name, url);
if (WebPartManager.Personalization.Scope == PersonalizationScope.Shared)
{
_sharedUrls ??= new ArrayList();
_sharedUrls.Add(p);
}
else
{
_userUrls ??= new ArrayList();
_userUrls.Add(p);
}
OnUrlAdded();
}
protected virtual void OnUrlAdded()
{
_listDirty = true;
ChildControlsCreated = false;
}
protected override void RenderContents(HtmlTextWriter writer)
{
if (_sharedUrls != null)
{
foreach (Pair p in _sharedUrls)
{
_list.Items.Add(new ListItem((string)p.First, (string)p.Second));
}
}
if (_userUrls != null)
{
foreach (Pair p in _userUrls)
{
_list.Items.Add(new ListItem((string)p.First, (string)p.Second));
}
}
base.RenderContents(writer);
}
public virtual bool IsDirty
{
get
{
return _listDirty;
}
}
public new virtual void Load(PersonalizationDictionary state)
{
if (state != null)
{
PersonalizationEntry sharedUrlsEntry = state["sharedUrls"];
if (sharedUrlsEntry != null)
{
_sharedUrls = (ArrayList)sharedUrlsEntry.Value;
}
PersonalizationEntry userUrlsEntry = state["userUrls"];
if (userUrlsEntry != null)
{
_userUrls = (ArrayList)userUrlsEntry.Value;
}
}
}
public virtual void Save(PersonalizationDictionary state)
{
if ((_sharedUrls != null) && (_sharedUrls.Count != 0))
{
state["sharedUrls"] = new PersonalizationEntry(_sharedUrls, PersonalizationScope.Shared);
}
if ((_userUrls != null) && (_userUrls.Count != 0))
{
state["userUrls"] = new PersonalizationEntry(_userUrls, PersonalizationScope.User);
}
}
}
public class UrlListExWebPart : UrlListWebPart, ITrackingPersonalizable
{
private string _trackingLog = String.Empty;
private bool _loading;
private bool _saving;
public override string Text
{
get
{
return base.Text;
}
set
{
if (base.Text.Equals(value) == false)
{
base.Text = value;
SetPersonalizationDirty();
}
}
}
protected override void OnUrlAdded()
{
base.OnUrlAdded();
SetPersonalizationDirty();
}
protected override void RenderContents(HtmlTextWriter writer)
{
base.RenderContents(writer);
writer.Write("<br />");
writer.Write("<pre id=\"" + ClientID + "$log" + "\">");
writer.Write(_trackingLog);
writer.Write("</pre>");
}
public override void Load(PersonalizationDictionary state)
{
if (_loading == false)
{
throw new InvalidOperationException();
}
}
public override void Save(PersonalizationDictionary state)
{
if (_saving == false)
{
throw new InvalidOperationException();
}
base.Save(state);
}
bool ITrackingPersonalizable.TracksChanges
{
get
{
return true;
}
}
void ITrackingPersonalizable.BeginLoad()
{
_loading = true;
_trackingLog = "1. BeginLoad\r\n";
}
void ITrackingPersonalizable.BeginSave()
{
_saving = true;
_trackingLog += "3. BeginSave\r\n";
}
void ITrackingPersonalizable.EndLoad()
{
_loading = false;
_trackingLog += "2. EndLoad\r\n";
}
void ITrackingPersonalizable.EndSave()
{
_saving = false;
_trackingLog += "4. EndSave";
}
}
}
Imports System.Collections
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Drawing
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Namespace PersTest
Public Class UrlListWebPart
Inherits WebPart
Implements IPersonalizable
Private _sharedUrls As ArrayList
Private _userUrls As ArrayList
Private _listDirty As Boolean
Private _nameTextBox As TextBox
Private _urlTextBox As TextBox
Private _addButton As Button
Private _list As BulletedList
Public Overrides ReadOnly Property Subtitle() As String
Get
Return [Text]
End Get
End Property
<Personalizable(), WebBrowsable()> _
Public Overridable Property [Text]() As String
Get
Dim o As Object = ViewState("Text")
If o Is Nothing Then
Return "My Links"
Else
Return CType(o, String)
End If
End Get
Set(ByVal value As String)
ViewState("Text") = value
End Set
End Property
Protected Overrides Sub CreateChildControls()
Dim nameLabel As New Label()
Dim urlLabel As New Label()
Dim breakLiteral1 As New LiteralControl("<br />")
Dim breakLiteral2 As New LiteralControl("<br />")
Dim breakLiteral3 As New LiteralControl("<br />")
_nameTextBox = New TextBox()
_urlTextBox = New TextBox()
_addButton = New Button()
_list = New BulletedList()
nameLabel.Text = "Name: "
urlLabel.Text = "URL: "
_nameTextBox.ID = "nameTextBox"
_urlTextBox.ID = "urlTextBox"
_addButton.Text = "Add"
_addButton.ID = "addButton"
AddHandler _addButton.Click, AddressOf Me.OnClickAddButton
_list.DisplayMode = BulletedListDisplayMode.HyperLink
_list.ID = "list"
Controls.Add(nameLabel)
Controls.Add(_nameTextBox)
Controls.Add(breakLiteral1)
Controls.Add(urlLabel)
Controls.Add(_urlTextBox)
Controls.Add(breakLiteral2)
Controls.Add(_addButton)
Controls.Add(breakLiteral3)
Controls.Add(_list)
End Sub
Private Sub OnClickAddButton(ByVal sender As Object, ByVal e As EventArgs)
Dim name As String = _nameTextBox.Text.Trim()
Dim url As String = _urlTextBox.Text.Trim()
Dim p As New Pair(name, url)
If WebPartManager.Personalization.Scope = PersonalizationScope.Shared Then
If _sharedUrls Is Nothing Then
_sharedUrls = New ArrayList()
End If
_sharedUrls.Add(p)
Else
If _userUrls Is Nothing Then
_userUrls = New ArrayList()
End If
_userUrls.Add(p)
End If
OnUrlAdded()
End Sub
Protected Overridable Sub OnUrlAdded()
_listDirty = True
ChildControlsCreated = False
End Sub
Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
If Not (_sharedUrls Is Nothing) Then
Dim p As Pair
For Each p In _sharedUrls
_list.Items.Add(New ListItem(CStr(p.First), CStr(p.Second)))
Next p
End If
If Not (_userUrls Is Nothing) Then
Dim p As Pair
For Each p In _userUrls
_list.Items.Add(New ListItem(CStr(p.First), CStr(p.Second)))
Next p
End If
MyBase.RenderContents(writer)
End Sub
Public Overridable ReadOnly Property IsDirty() As Boolean _
Implements IPersonalizable.IsDirty
Get
Return _listDirty
End Get
End Property
Public Overridable Shadows Sub Load(ByVal state As PersonalizationDictionary) Implements IPersonalizable.Load
If Not (state Is Nothing) Then
Dim sharedUrlsEntry As PersonalizationEntry = state("sharedUrls")
If Not (sharedUrlsEntry Is Nothing) Then
_sharedUrls = CType(sharedUrlsEntry.Value, ArrayList)
End If
Dim userUrlsEntry As PersonalizationEntry = state("userUrls")
If Not (userUrlsEntry Is Nothing) Then
_userUrls = CType(userUrlsEntry.Value, ArrayList)
End If
End If
' Return False
End Sub
Public Overridable Sub Save(ByVal state As PersonalizationDictionary) Implements IPersonalizable.Save
If Not (_sharedUrls Is Nothing) AndAlso _sharedUrls.Count <> 0 Then
state("sharedUrls") = New PersonalizationEntry(_sharedUrls, PersonalizationScope.Shared)
End If
If Not (_userUrls Is Nothing) AndAlso _userUrls.Count <> 0 Then
state("userUrls") = New PersonalizationEntry(_userUrls, PersonalizationScope.User)
End If
End Sub
End Class
Public Class UrlListExWebPart
Inherits UrlListWebPart
Implements ITrackingPersonalizable
Private _trackingLog As String = String.Empty
Private _loading As Boolean
Private _saving As Boolean
Public Overrides Property [Text]() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
If MyBase.Text.Equals(value) = False Then
MyBase.Text = value
SetPersonalizationDirty()
End If
End Set
End Property
Protected Overrides Sub OnUrlAdded()
MyBase.OnUrlAdded()
SetPersonalizationDirty()
End Sub
Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
MyBase.RenderContents(writer)
writer.Write("<br />")
writer.Write("<pre id=""" + ClientID + "$log" + """>")
writer.Write(_trackingLog)
writer.Write("</pre>")
End Sub
Public Overrides Sub Load(ByVal state As PersonalizationDictionary)
If _loading = False Then
Throw New InvalidOperationException()
End If
MyBase.Load(state)
End Sub
Public Overrides Sub Save(ByVal state As PersonalizationDictionary)
If _saving = False Then
Throw New InvalidOperationException()
End If
MyBase.Save(state)
End Sub
ReadOnly Property TracksChanges() As Boolean Implements ITrackingPersonalizable.TracksChanges
Get
Return True
End Get
End Property
Sub BeginLoad() Implements ITrackingPersonalizable.BeginLoad
_loading = True
_trackingLog = "1. BeginLoad" + vbCr + vbLf
End Sub
Sub BeginSave() Implements ITrackingPersonalizable.BeginSave
_saving = True
_trackingLog += "3. BeginSave" + vbCr + vbLf
End Sub
Sub EndLoad() Implements ITrackingPersonalizable.EndLoad
_loading = False
_trackingLog += "2. EndLoad" + vbCr + vbLf
End Sub
Sub EndSave() Implements ITrackingPersonalizable.EndSave
_saving = False
_trackingLog += "4. EndSave"
End Sub
End Class
Nella pagina di .aspx seguente viene creata un'area Web part e viene aggiunto il controllo all'area. La pagina fa riferimento anche a un controllo di accesso da usare per accedere a singoli utenti in modo che sia possibile applicare la personalizzazione.
<%@ Page Language="C#" %>
<%@ Register TagPrefix="dict" namespace="PersTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:WebPartManager ID="WebPartManager1" runat="server"></asp:WebPartManager>
<asp:LoginName ID="LoginName1" runat="server" />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="RedirectToLoginPage" />
<br />
<div>
<asp:WebPartZone ID="WebPartZone1" runat="server">
<ZoneTemplate>
<dict:UrlListWebPart id="PersDict" title="Personalization Dictionary" runat="server" />
</ZoneTemplate>
</asp:WebPartZone>
</div>
</form>
</body>
</html>
<%@ Page Language="VB" %>
<%@ Register TagPrefix="dict" namespace="PersTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:WebPartManager ID="WebPartManager1" runat="server"></asp:WebPartManager>
<asp:LoginName ID="LoginName1" runat="server" />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="RedirectToLoginPage" />
<br />
<div>
<asp:WebPartZone ID="WebPartZone1" runat="server">
<ZoneTemplate>
<dict:UrlListWebPart id="PersDict" title="Personalization Dictionary" runat="server" />
</ZoneTemplate>
</asp:WebPartZone>
</div>
</form>
</body>
</html>
Commenti
Questa interfaccia consente agli sviluppatori di controllare le diverse fasi del ciclo di vita della personalizzazione, incluso il caricamento e il salvataggio dei dati di personalizzazione. Nella maggior parte dei casi, per usare questa interfaccia è necessario creare un'interfaccia personalizzata WebPart o WebPartManager e implementare questa interfaccia. Inoltre, i controlli che devono gestire la propria verifica delle modifiche ("dirty") devono implementare questa interfaccia. I controlli che gestiscono il rilevamento delle modifiche devono restituire true
dalla TracksChanges proprietà .
Se false
viene restituito, ASP.NET è responsabile della determinazione delle modifiche confrontando le informazioni sulla proprietà caricate con le informazioni sulla proprietà salvate.
Proprietà
TracksChanges |
Indica se il controllo tiene traccia dello stato delle relative modifiche. |
Metodi
BeginLoad() |
Rappresenta l'inizio della fase di caricamento per le informazioni sulla personalizzazione. |
BeginSave() |
Rappresenta la fase precedente all'estrazione dei dati sulla personalizzazione da un controllo. |
EndLoad() |
Rappresenta la fase successiva all'applicazione dei dati sulla personalizzazione a un controllo. |
EndSave() |
Rappresenta la fase successiva all'estrazione dei dati sulla personalizzazione da un controllo. |