ITrackingPersonalizable 인터페이스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
웹 파트 컨트롤에서 특정 단계의 개인 설정 로드 및 저장 프로세스를 추적할 수 있도록 합니다.
public interface class ITrackingPersonalizable
public interface ITrackingPersonalizable
type ITrackingPersonalizable = interface
Public Interface ITrackingPersonalizable
- 파생
예제
다음 코드 예제에서는 메서드 및 속성을 사용하여 ITrackingPersonalizable 개인 설정 정보의 로드 및 저장을 추적하는 방법을 보여 줍니다. 이 예제는 .aspx 페이지와 App_Code 하위 디렉터리에 배치해야 하는 파일의 두 부분으로 구성됩니다.
다음 코드 예제에서는 사용자가 URL 정보를 입력할 수 있는 웹 파트 컨트롤을 만들고 사용자에 대 한이 정보를 저장 합니다.
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))
{
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)
{
throw new InvalidOperationException();
}
}
public override void Save(PersonalizationDictionary state)
{
if (!_saving)
{
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
다음 .aspx 페이지에서 웹 파트 영역을 만들고 영역에 컨트롤을 추가합니다. 또한 페이지에서는 개인 설정을 적용할 수 있도록 개별 사용자에 로그온하는 데 사용해야 하는 로그인 컨트롤을 참조합니다.
<%@ 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>
설명
이 인터페이스를 사용하면 컨트롤 개발자가 개인 설정 데이터의 로드 및 저장을 포함하여 개인 설정 수명 주기의 다양한 단계를 추적할 수 있습니다. 대부분의 경우 이 인터페이스를 사용하려면 사용자 지정 WebPart 을 만들거나 WebPartManager 이 인터페이스를 구현합니다. 또한 자체 변경("더티") 추적을 관리해야 하는 컨트롤은 이 인터페이스를 구현해야 합니다. 자체 변경 내용 추적을 관리하는 컨트롤은 TracksChanges 속성에서 반환 true
되어야 합니다.
가 반환되면 false
ASP.NET 저장된 속성 정보와 로드된 속성 정보를 비교하여 변경 내용을 결정합니다.
속성
TracksChanges |
컨트롤에서 변경 상태를 추적하는지 여부를 나타냅니다. |
메서드
BeginLoad() |
개인 설정 정보의 로드 시작 단계를 나타냅니다. |
BeginSave() |
컨트롤에서 개인 설정 데이터를 추출하기 이전 단계를 나타냅니다. |
EndLoad() |
개인 설정 데이터를 컨트롤에 적용한 후의 단계를 나타냅니다. |
EndSave() |
개인 설정 데이터를 컨트롤에서 추출한 후의 단계를 나타냅니다. |
적용 대상
추가 정보
.NET