チュートリアル : IPersonalizable を使用した Web パーツのパーソナル化の実装
更新 : 2007 年 11 月
このチュートリアルでは、パーソナル化できる Web パーツ コントロールとしてユーザー コントロールを実装することで、ユーザー固有の既定値を提供する方法を示します。
このコントロールの最も重要な特性は、パーソナル化できるプロパティが値型以外の変数に格納されていることです。この場合、値は BulletedList コントロールに格納されます。つまり、ユーザーがリストの値を変更したタイミングをシステムが把握する方法はありません。このチュートリアルでは、変更した値を後で使用できるように、値が変更されたことをシステムに通知する方法について説明します。これは、ユーザーごとにカスタマイズできるオンライン フォームを作成する場合に便利です。Web パーツのパーソナル化によって、システムがユーザーを認識できるため、ユーザーが次にサイトにアクセスしたときに、ユーザーの既定のフォーム値を自動的に復元できます。
メモ : |
---|
このチュートリアルで作成するユーザー コントロールは、WebPart クラスを継承しませんが、ユーザー コントロールは WebPart コントロールとして機能します。チュートリアルを実行しているときに、ユーザー コントロールを WebPartZoneBase ゾーンに追加します。これにより、ASP.NET が GenericWebPart コントロールでユーザー コントロールをラップします。これで、ユーザー コントロールは他の WebPart コントロールのように動作するため、パーソナル化について学ぶことができます。 |
このチュートリアルでは、次の作業を行う方法について説明します。
パーソナル化できるプロパティを持つユーザー コントロールを作成し、その値を長期ストレージに保存します。
ユーザー固有の既定値を表示します。
ゾーン内のユーザー コントロールを実際の WebPart コントロールとして操作します。
メモ : |
---|
この種のアプリケーションは、ASP.NET プロファイルを使用して開発できます。ただし、この場合、買い物カゴ アプリケーションのように、ユーザーに関してアプリケーション全体で再利用する情報は格納されません。代わりに、ページごとのユーザー固有の設定または各コントロールの設定を保存します。プロファイルの詳細については、「ASP.NET プロファイル プロパティの概要」を参照してください。 |
前提条件
このチュートリアルを完了するための要件を次に示します。
サイトをホストするコンピュータにインストールして構成したインターネット インフォメーション サービス (IIS: Internet Information Services)。IIS のインストールと構成の詳細については、インストールに含まれている IIS ヘルプ ドキュメント、または Microsoft TechNet サイト (Internet Information Services 6.0 Technical Resources) にある IIS オンライン ドキュメントを参照してください。
個別のユーザーを識別できる ASP.NET Web サイト。そのようなサイトを既に構成している場合は、このチュートリアルの開始点としてそのサイトを使用できます。サイトをまだ構成していない場合、仮想ディレクトリまたはサイトの作成方法の詳細については、「方法 : IIS 5.0 および 6.0 内で仮想ディレクトリを作成および構成する」を参照してください。
構成済みのパーソナル化プロバイダおよびデータベース。Web パーツのパーソナル化は既定で有効に設定されており、Microsoft SQL Server Standard Edition (SSE) の SQL パーソナル化プロバイダ (SqlPersonalizationProvider) を使用して、パーソナル化データを格納します。このチュートリアルでは、SSE と既定の SQL プロバイダを使用します。SSE がインストールされている場合は、構成を行う必要はありません。SSE は Microsoft Visual Studio 2005 でインストールのオプションの一部として使用するか、または Microsoft.com から無料でダウンロードできます。SQL Server のいずれかの完全バージョンを使用するには、ASP.NET アプリケーション サービス データベースをインストールして設定し、そのデータベースに接続する SQL パーソナル化プロバイダを設定する必要があります。詳細については、「SQL Server 向けアプリケーション サービス データベースの作成と構成」を参照してください。また、カスタム プロバイダを作成して構成し、他の SQL 以外のデータベースまたはストレージ ソリューションで使用することもできます。コード例および詳細については、「メンバシップ プロバイダの実装」を参照してください。
参照型変数を含むパーソナル化できるユーザー コントロールの作成
チュートリアルのこの部分では、Web サイトの表示名と URL を入力できるユーザー コントロールを作成します。[Save] ボタンをクリックすると、表示名が BulletedList コントロールに追加されます。この値は、ユーザーごとに Web パーツのパーソナル化機能によって格納されます。ユーザーが別のページからの移動または新規セッションでコントロールにアクセスするたびに、保存されている BulletedList 値が表示されます。
メモ : |
---|
Web パーツ パーソナル化は既定で有効になるため、有効にする必要はありません。パーソナル化の詳細については、「Web パーツのパーソナル化の概要」を参照してください。 |
パーソナル化できるユーザー コントロールを作成するには
テキスト エディタでユーザー コントロールを含む新しいファイルを作成し、UrlList.ascx と名前を付けて Web ディレクトリに保存します。コントロールの動作を実装するコードは、手順 4. のように別のファイルに含まれます。
新規ファイルに、使用するプログラミング言語のコントロール ディレクティブを追加します。次に例を示します。
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="UrlList.ascx.vb" Inherits="WebParts_UrlList" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UrlList.ascx.cs" Inherits="WebParts_UrlList" %>
ディレクティブの下に、コントロールのユーザー インターフェイス (UI) を表す次の要素を追加します。
<table> <tr> <td> <asp:Label ID="NameLabelID" Text="Name: " runat="server" /> </td> <td> <asp:TextBox ID="NameTextBoxID" runat="server" /> </td> </tr> <tr> <td> <asp:Label ID="UrlLabelID1" Text="Url: " runat="server" /> </td> <td> <asp:TextBox ID="UrlTextBoxID" runat="server" /> </td> </tr> <tr> <td> <asp:Button ID="SaveID" runat="server" OnClick="SaveButton_Click" Text="Save" /> </td> <td> <asp:Button ID="ResetID" runat="server" OnClick="ResetButton_Click" Text="Reset" /> </td> </tr> </table> <div> // This is the complex variable whose status // must be preserved. <asp:BulletedList ID="BulletedListID" runat="server" DisplayMode="HyperLink" Target="_blank" /> </div>
さらにコンパニオン ファイルとして動作する新規ファイルを作成し、次のコードを追加します。前の UrlList.ascx コントロールの動作を実装するコンパニオン ファイル (使用する言語に応じて UrlList.ascx.vb または UrlList.ascx.cs) の例を次に示します。このコードは 2 つの部分に分かれます。一方には、ユーザー入力とページ読み込みイベントを処理するコードが含まれます。もう一方には、IPersonalizable インターフェイスを実装するコードが含まれます。これによって、BulletedList 値を保存できるようになります。つまり、ユーザー コントロールのパーソナル化です。この例では、Load、Save、および IsDirty の各インターフェイス メンバを実装します。
' 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; } }
使用している言語に応じて UrlList.ascx.vb または UrlList.ascx.cs という名前をファイルに付け、Web サイトのルート ディレクトリに保存します。
セキュリティに関するメモ : このコントロールには、ユーザー入力を受け付けるテキスト ボックスがあるため、セキュリティ上の脅威になる可能性があります。Web ページのユーザー入力には、悪意のあるクライアントのスクリプトが含まれる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力に HTML 要素またはスクリプトが含まれていないことを検証します。この検証が有効の場合は、ユーザー入力にスクリプトや HTML 要素が含まれているかどうかを明示的に確認する必要はありません。詳細については、「スクリプトによる攻略の概要」を参照してください。
Web パーツ コントロールとしてのユーザー コントロールの参照
これで、パーソナル化できるプロパティを持つユーザー コントロールが作成されたため、Web フォーム ページを作成し、このユーザー コントロールを Web パーツ コントロールとしてホストできます。
メモ : |
---|
パーソナル化が機能するには、コントロールを Web パーツ コントロールとしてホストする必要があります。 |
ユーザー コントロールを Web パーツ コントロールとして参照するには
テキスト エディタで、新しいファイルを作成します。ファイルの先頭にページの宣言を追加します。次に例を示します。
<%@ page language="VB" %>
<%@ page language="C#" %>
次の例に示すように、ページ宣言の下に、前に作成したユーザー コントロールを参照する宣言を追加します。
<%@ Register tagprefix="UserControl" tagname="UrlList" src="UrlList.ascx" %>
<%@ Register tagprefix="UserControl" tagname="UrlList" src="UrlList.ascx" %>
コントロール参照の下に、ユーザー コントロールを Web パーツ コントロールとしてホストする、次の基本的なページ構造を追加します。
メモ : ユーザー コントロールが Web パーツ コントロールとして機能するには、次の例に示すように、ページに <asp:webpartmanager> 要素を組み込み、ユーザー コントロールを <asp:webpartzone> 要素および <zonetemplate> 要素に連続して組み込む必要があります。
<html> <head runat="server"> <title>Personalizable User Control</title> </head> <body> <form id="form1" runat="server"> <asp:WebPartManager ID="mgr" runat="server" /> <div> <asp:WebPartZone ID="WebPartZone1" runat="server"> <ZoneTemplate> < UserControl:UrlList ID="AccUserID" runat="server" title="URL List WebPart" /> </ZoneTemplate> </asp:WebPartZone> </div> </form> </body> </html>
ファイルに UrlList.aspx という名前を付け、ユーザー コントロールと同じディレクトリに保存します。
これでパーソナル化できるユーザー コントロールが作成され、Web フォーム ページでそれが Web パーツ コントロールとして参照されます。
最後の手順では、このユーザー コントロールをテストします。
パーソナル化できるユーザー コントロールをテストするには
UrlList.aspx ページをブラウザに読み込みます。
[Name] フィールドおよび [URL] フィールドに値を入力し、[Save Form Values] をクリックします。
ブラウザを閉じます。
ページをもう一度ブラウザに読み込みます。
前で入力した値がフォームに表示されます。これらは、BulletedList コントロールに保存され、ブラウザにページを読み込んだときにデータベースから復元された値です。
フォームに新しい名前を入力しますが、保存を実行するボタンはクリックしません。ブラウザを閉じます。
ページをもう一度ブラウザに読み込みます。パーソナル化できるプロパティに入力して保存した元の値が、フォームに再び表示されます。
次の手順
このチュートリアルでは、パーソナル化できるプロパティを持つユーザー コントロールの作成に関連する基本的な作業について説明しました。特定のコントロールおよびページ用のユーザー固有の設定を保存し、新しいブラウザ セッションでユーザーがページにもう一度アクセスすると、保存されたこれらの設定を表示できるコントロールを作成しました。次に行う作業の例を示します。
Web パーツ ページの作成に関連するその他のコンポーネントについて調べます。概要については、「チュートリアル : Web パーツ ページの作成」を参照してください。
ユーザー コントロールの操作についてさらに習得します。詳細については、「ASP.NET ユーザー コントロールの概要」を参照してください。
ユーザー コントロールに比べてプログラムによるより詳細な制御が可能で、すべての範囲の Web パーツ機能を備えた独自のカスタム Web パーツ コントロールを作成する方法について習得します。詳細については、「方法 : ユーザー コントロールを Web パーツ コントロールとして処理する」を参照してください。