연습: IPersonalizable을 사용하여 웹 파트 개인 설정 구현

업데이트: 2007년 11월

이 연습에서는 사용자 정의 컨트롤을 개인 설정할 수 있는 웹 파트 컨트롤로 구현하여 사용자별 기본값을 제공하는 방법을 보여 줍니다.

이 컨트롤의 가장 중요한 특징은 값이 아닌 형식의 변수에 개인 설정 가능한 속성이 저장된다는 점입니다. 이 경우 값은 BulletedList 컨트롤에 저장됩니다. 즉, 사용자가 목록의 값을 변경하더라도 시스템에서 그 사실을 알지 못합니다. 이 연습에서는 값이 변경되었음을 시스템에 알려 나중에 사용할 수 있도록 이를 유지하는 방법을 보여 줍니다. 이는 사용자별로 사용자 지정할 수 있는 온라인 폼을 만들려는 경우에 유용할 수 있습니다. 웹 파트 개인 설정을 사용하면 시스템에서 사용자를 인식하고 이 사용자가 사이트를 다시 방문하면 해당 기본 폼의 값을 자동으로 복원할 수 있습니다.

참고:

이 연습에서 만드는 사용자 정의 컨트롤은 WebPart 클래스에서 상속되지 않습니다. 그러나 사용자 정의 컨트롤이 WebPart 컨트롤의 기능을 수행할 수는 있습니다. 이 연습을 수행하는 동안 사용자 정의 컨트롤을 WebPartZoneBase 영역에 추가합니다. 이렇게 하면 ASP.NET에서 사용자 정의 컨트롤을 GenericWebPart 컨트롤에 래핑할 수 있습니다. 그러면 사용자 정의 컨트롤이 다른 WebPart 컨트롤과 같이 작동하므로 개인 설정을 연습해 볼 수 있습니다.

이 연습을 통해 다음을 수행하는 방법을 배웁니다.

  • 값을 장기간 저장소에 저장할 수 있으며 개인 설정이 가능한 속성을 사용하여 사용자 정의 컨트롤을 만듭니다.

  • 사용자별 기본값을 표시합니다.

  • 사용자 정의 컨트롤을 영역에서 실제 WebPart 컨트롤처럼 사용합니다.

참고:

이러한 형식의 응용 프로그램은 ASP.NET 프로필을 사용하여 개발할 수 있습니다. 그러나 이 경우에는 장바구니 응용 프로그램에서처럼 사용자 정보를 전체 응용 프로그램에서 다시 사용할 수 있는 방식으로 저장하지 않습니다. 대신, 페이지 단위로 각 컨트롤에 대한 사용자별 기본 설정 또는 설정을 저장합니다. 프로필에 대한 자세한 내용은 ASP.NET 프로필 속성 개요를 참조하십시오.

사전 요구 사항

이 연습을 완료하려면 다음이 필요합니다.

  • 사이트를 호스팅하는 컴퓨터에 IIS(인터넷 정보 서비스)가 설치 및 구성되어야 합니다. IIS 설치 및 구성에 대한 자세한 내용은 설치 프로그램에 포함된 IIS 도움말 문서를 참조하거나 Microsoft TechNet 사이트의 온라인 IIS 설명서(Internet Information Services 6.0 Technical Resources)를 참조하십시오.

  • 개별 사용자를 식별할 수 있는 ASP.NET 웹 사이트가 있어야 합니다. 사이트가 이미 구성되어 있으면 해당 사이트에서 이 연습을 시작할 수 있습니다. 그렇지 않은 경우, 가상 디렉터리 또는 사이트를 만드는 데 대한 자세한 내용은 방법: IIS 5.0 및 6.0에서 가상 디렉터리 만들기 및 구성를 참조하십시오.

  • 개인 설정 공급자 및 데이터베이스가 구성되어 있어야 합니다. 웹 파트 개인 설정은 기본적으로 사용되며, Microsoft SQL SSE(Server Standard Edition)의 SQL 개인 설정 공급자(SqlPersonalizationProvider)를 사용하여 개인 설정 데이터를 저장합니다. 이 연습에서는 SSE와 기본 SQL 공급자를 사용합니다. SSE가 설치되어 있으면 구성이 필요하지 않습니다. SSE는 Microsoft Visual Studio 2005를 설치할 때 옵션으로 선택하거나 Microsoft.com에서 무료로 다운로드할 수 있습니다. SQL Server 정식 버전을 사용하려면 ASP.NET 응용 프로그램 서비스 데이터베이스를 설치 및 구성하고 SQL 개인 설정 공급자를 구성하여 해당 데이터베이스에 연결해야 합니다. 자세한 내용은 SQL Server용 응용 프로그램 서비스 데이터베이스 만들기 및 구성을 참조하십시오. SQL 이외의 데이터베이스나 저장소 솔루션에서 사용할 사용자 지정 공급자를 만들고 구성할 수도 있습니다. 자세한 내용과 코드 예제는 멤버 자격 공급자 구현을 참조하십시오.

참조 형식 변수가 포함된 개인 설정 가능한 사용자 정의 컨트롤 만들기

이 연습 부분에서는 웹 사이트의 URL 및 이름을 입력하는 데 사용할 수 있는 사용자 정의 컨트롤을 만듭니다. 저장 단추를 클릭하면 이름이 BulletedList 컨트롤에 추가됩니다. 이들 값은 사용자별로 웹 파트 개인 설정 기능을 통해 저장됩니다. 사용자가 새 세션이나 다른 페이지의 컨트롤에 액세스할 때마다 시스템을 통해 저장된 BulletedList 값이 표시됩니다.

참고:

웹 파트 개인 설정은 기본적으로 사용되므로 사용하도록 설정할 필요가 없습니다. 개인 설정에 대한 자세한 내용은 웹 파트 개인 설정 개요를 참조하십시오.

개인 설정할 수 있는 사용자 정의 컨트롤을 만들하려면

  1. 텍스트 편집기에서 사용자 정의 컨트롤을 포함할 새 파일을 만들고 이름을 UrlList.ascx로 지정한 다음 웹 디렉터리에 저장합니다. 컨트롤의 동작을 구현하는 코드는 4단계에 나와 있는 별도의 파일에 포함됩니다.

  2. 새 파일에서 다음 예제와 같이 사용 중인 프로그래밍 언어로 컨트롤 지시문을 추가합니다.

    <%@ Control Language="VB" AutoEventWireup="false"  
    CodeFile="UrlList.ascx.vb" Inherits="WebParts_UrlList" %>
    
    <%@ Control Language="C#" AutoEventWireup="true" 
    CodeFile="UrlList.ascx.cs" Inherits="WebParts_UrlList" %>
    
  3. 컨트롤의 UI(사용자 인터페이스)를 나타내는 다음과 같은 요소를 지시문 아래 추가합니다.

    <table>
    
    <tr>
        <td> 
            <asp:Label ID="NameLabelID" Text="Name: "  />
        </td>
        <td>
            <asp:TextBox ID="NameTextBoxID"  />
        </td>
    </tr>
    
    <tr>
        <td>
            <asp:Label ID="UrlLabelID1" Text="Url:  "  />
        </td>
        <td>
            <asp:TextBox ID="UrlTextBoxID"  />
        </td>
    </tr>
    
    <tr>
        <td>
            <asp:Button ID="SaveID"  
                OnClick="SaveButton_Click" Text="Save" />
        </td>
        <td>
            <asp:Button ID="ResetID"  
                OnClick="ResetButton_Click" Text="Reset" />
        </td>
    </tr>
    
    </table>
    
    <div>
         // This is the complex variable whose status 
         // must be preserved.
        <asp:BulletedList 
            ID="BulletedListID" 
            DisplayMode="HyperLink"  Target="_blank" />
    
    </div>
    
  4. 자매 파일로 사용할 다른 새 파일을 만들고 이 파일에 다음 코드를 추가합니다. 다음 예제에는 앞서 설명한 UrlList.ascx 컨트롤의 동작을 구현하는 자매 파일(사용하는 언어에 따라 UrlList.ascx.vb 또는 UrlList.ascx.cs)이 나와 있습니다. 이 코드는 두 부분으로 나누어져 있습니다. 한 부분에는 사용자 입력 및 페이지 로드 이벤트를 처리하는 코드가 포함되고, 다른 부분에는 IPersonalizable 인터페이스를 구현하는 코드가 포함됩니다. 이를 통해 BulletedList 값, 즉 사용자 정의 컨트롤의 개인 설정을 유지할 수 있습니다. 이 예제에서는 Load, SaveIsDirty 인터페이스 멤버를 구현합니다.

    ' UrlList.ascx.vb
    Imports System
    Imports System.Collections
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    
    Partial Class WebParts_VB_UrlList
        Inherits System.Web.UI.UserControl
        Implements IPersonalizable
    
        Private _userUrls As ArrayList
        Private _listDirty As Boolean
    
        ' This code implements the IPersonalizable members.
    
        Public Overridable ReadOnly Property IsDirty() As Boolean _
        Implements System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty
    
            Get
                Return _listDirty
            End Get
        End Property
    
    
        Public Overridable Shadows Sub Load(ByVal state As PersonalizationDictionary) _
        Implements System.Web.UI.WebControls.WebParts.IPersonalizable.Load
    
    
            If Not (state Is Nothing) Then
    
                Dim userUrlsEntry As PersonalizationEntry = state("userUrls")
                If Not (userUrlsEntry Is Nothing) Then
                    _userUrls = CType(userUrlsEntry.Value, ArrayList)
                End If
            End If
    
        End Sub 'Load
    
        Public Overridable Sub Save(ByVal state As PersonalizationDictionary) _
          Implements System.Web.UI.WebControls.WebParts.IPersonalizable.Save
    
            If Not (_userUrls Is Nothing) AndAlso _userUrls.Count <> 0 Then
                state("userUrls") = New PersonalizationEntry(_userUrls, _
                PersonalizationScope.User)
            End If
    
        End Sub
    
        ' This code handles the user's input.
        Protected Sub SaveButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs)
    
            Dim name As String = NameTextBoxID.Text.Trim()
            Dim url As String = UrlTextBoxID.Text.Trim()
    
            Dim p As New Pair(name, url)
    
            If _userUrls Is Nothing Then
                _userUrls = New ArrayList()
            End If
            _userUrls.Add(p)
    
            BulletedListID.Items.Add(New ListItem(CStr(p.First), _
            CStr(p.Second)))
    
            _listDirty = True
    
        End Sub 'SaveButton_Click
    
    
        Protected Sub ResetButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs)
    
            _userUrls = New ArrayList()
    
             BulletedListID.Items.Clear()
    
            _listDirty = True
    
        End Sub 'ResetButton_Click 
    
    
        Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As EventArgs)
            If Not (_userUrls Is Nothing) Then
                BulletedListID.Items.Clear()
                Dim p As Pair
                For Each p In _userUrls
                    BulletedListID.Items.Add(New _
                    ListItem(CStr(p.First), CStr(p.Second)))
                Next p
            End If
    
        End Sub 'Page_Load
    
    End Class
    
    // UrlList.ascx.cs
    using System;
    using System.Collections;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    
    public partial class WebParts_UrlList : System.Web.UI.UserControl, 
        IPersonalizable
    {
        private ArrayList _userUrls;
        private bool _listDirty;
    
           // This code implements the IPersonalizable members.
    
        public new void Load(PersonalizationDictionary state)
        {
            if (state != null)
            {
    
                PersonalizationEntry userUrlsEntry = state["userUrls"];
                if (userUrlsEntry != null)
                {
                    _userUrls = (ArrayList)userUrlsEntry.Value;
                }
    
            }
        }
    
        public void Save(PersonalizationDictionary state)
        {
    
            if ((_userUrls != null) && (_userUrls.Count != 0))
            {
                state["userUrls"] =
                    new PersonalizationEntry(_userUrls, PersonalizationScope.User);
            }
    
        }
    
        public virtual bool IsDirty
        {
            get
            {
                return _listDirty;
            }
        }
    
           // This code handles the user's input.
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (_userUrls != null)
            {
                BulletedListID.Items.Clear();
                foreach (Pair p in _userUrls)
                {
                    BulletedListID.Items.Add(
                        new ListItem((string)p.First, (string)p.Second));
                }
            }
    
        }
    
        protected void SaveButton_Click(object sender, EventArgs e)
        {
            string name = NameTextBoxID.Text.Trim();
            string url = UrlTextBoxID.Text.Trim();
    
            Pair p = new Pair(name, url);
    
            if (_userUrls == null)
            {
                _userUrls = new ArrayList();
            }
            _userUrls.Add(p);
    
            BulletedListID.Items.Add(
                    new ListItem((string)p.First, (string)p.Second));
    
            _listDirty = true;
        }
    
    
        protected void ResetButton_Click(object sender, EventArgs e)
        {
    
            _userUrls = new ArrayList();
    
             BulletedListID.Items.Clear();
    
            _listDirty = true;
    
        }
    
    } 
    
  5. 사용하는 언어에 따라 파일 이름을 UrlList.ascx.vb 또는 UrlList.ascx.cs로 지정한 다음 웹 사이트의 루트 디렉터리에 저장합니다.

    보안 정보:

    이 컨트롤에는 사용자 입력을 허용하는 텍스트 상자가 있으므로 보안상 위험할 수 있습니다. 웹 페이지의 사용자 입력에는 악의적인 클라이언트 스크립트가 포함될 수 있습니다. 기본적으로 ASP.NET 웹 페이지에서는 사용자 입력의 유효성을 검사하여 입력에 HTML 요소나 스크립트가 포함되지 않도록 합니다. 이러한 유효성 검사를 사용하는 경우에는 사용자 입력에서 스크립트 또는 HTML 요소를 명시적으로 검사할 필요가 없습니다. 자세한 내용은 스크립트 악용 개요를 참조하십시오.

사용자 정의 컨트롤을 웹 파트 컨트롤로 참조

개인 설정할 수 있는 속성이 있는 사용자 정의 컨트롤을 만들었으므로 사용자 정의 컨트롤을 웹 파트 컨트롤로 호스팅하는 Web Forms 페이지를 만들 수 있습니다.

참고:

개인 설정이 작동하려면 컨트롤을 웹 파트 컨트롤로 호스팅해야 합니다.

사용자 정의 컨트롤을 웹 파트 컨트롤로 참조하려면

  1. 텍스트 편집기에서 새 파일을 만듭니다. 다음 예제에서와 같이 파일 시작 부분에 페이지 선언을 추가합니다.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. 페이지 선언 아래에 다음 예제와 같이 앞서 만든 사용자 정의 컨트롤을 참조하는 선언을 추가합니다.

    <%@ Register tagprefix="UserControl" tagname="UrlList" 
    src="UrlList.ascx" %>
    
    <%@ Register tagprefix="UserControl" tagname="UrlList" 
    src="UrlList.ascx" %>
    
  3. 컨트롤 참조 아래에 사용자 정의 컨트롤을 웹 파트 컨트롤로 호스팅하는 다음과 같은 기본 페이지 구조를 추가합니다.

    참고:

    사용자 정의 컨트롤이 웹 파트 컨트롤로 작동하려면, 다음 예제와 같이 페이지에 <asp:webpartmanager> 요소가 있고 사용자 정의 컨트롤이 <asp:webpartzone> 요소 및 <zonetemplate> 요소 내에 포함되어야 합니다.

    <html>
    <head >
        <title>Personalizable User Control</title>
    </head>
    <body>
        <form id="form1" >
          <asp:WebPartManager ID="mgr"  />
            <div>
              <asp:WebPartZone ID="WebPartZone1" >
                <ZoneTemplate>
                  < UserControl:UrlList ID="AccUserID" 
                    title="URL List WebPart" />  
                </ZoneTemplate>
              </asp:WebPartZone>
            </div>    
        </form>
    </body>
    </html>
    
  4. 파일 이름을 UrlList.aspx로 지정하고 이 파일을 사용자 정의 컨트롤과 같은 디렉터리에 저장합니다.

    이제 개인 설정할 수 있는 사용자 정의 컨트롤을 만들고, 이를 Web Forms 페이지의 웹 파트 컨트롤로 참조했습니다.

마지막으로 사용자 정의 컨트롤을 테스트합니다.

개인 설정할 수 있는 사용자 정의 컨트롤을 테스트하려면

  1. 브라우저에서 UrlList.aspx 페이지를 로드합니다.

  2. NameURL 필드에 값을 입력하고 Save Form Values 단추를 클릭합니다.

  3. 브라우저를 닫습니다.

  4. 브라우저에서 페이지를 다시 로드합니다.

    앞서 입력한 값이 폼에 나타나야 합니다. 이 값은 BulletedList 컨트롤에 저장한 값이므로 브라우저에서 페이지를 다시 로드할 때 데이터베이스에서 복원되었습니다.

  5. 폼에 새 값을 입력하되 저장하는 단추를 클릭하지 않습니다. 브라우저를 닫습니다.

  6. 브라우저에서 페이지를 다시 로드합니다. 입력하여 개인 설정 속성에 저장한 원래 값이 폼에 다시 나타나야 합니다.

다음 단계

이 연습에서는 개인 설정할 수 있는 속성이 있는 사용자 정의 컨트롤을 만드는 것과 관련된 기본 작업에 대해 설명했습니다. 특정 컨트롤과 페이지에 대한 사용자별 설정을 저장하고 사용자가 새 브라우저 세션에서 이 페이지를 다시 방문할 때 이러한 저장된 설정을 표시할 수 있는 컨트롤을 만들었습니다. 다음과 같은 제안을 따르는 것이 좋습니다.

참고 항목

개념

ASP.NET 웹 파트 개요

웹 파트 개인 설정 개요