チュートリアル : Web パーツ ページでの表示モードの変更
更新 : 2007 年 11 月
このチュートリアルでは、ASP.NET Web パーツ ページでの表示モードを変更する 2 つの方法と、ユーザーがページの表示モードを切り替える方法について説明します。このチュートリアルでは、次の作業を行う方法について説明します。
Web パーツ コントロールを含む Web ページでの表示モードを変更できるカスタム ユーザー コントロールの作成
Web パーツ ページでのさまざまな表示モードへの切り替え
各表示モードとそれらの使い分けの詳細については、「Web パーツ ページの表示モード」を参照してください。
前提条件
このチュートリアルを実行するための要件は次のとおりです。
サイトをホストするコンピュータにインストールして構成したインターネット インフォメーション サービス (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 パーツのパーソナル化は既定で有効になっており、SQL Server Express (SSE) Edition に付属の SQL パーソナル化プロバイダ (SqlPersonalizationProvider) を使用してパーソナル化データを格納します。このチュートリアルでは、SSE と既定の SQL プロバイダを使用します。SSE をインストール済みである場合、構成は必要ありません。SSE は、Microsoft Visual Studio 2005 のインストール時にオプションでインストールすることも、Microsoft.com から無料でダウンロードすることもできます。詳細については、Microsoft SQL Server 2005 Express Edition Web サイトを参照してください。SQL Server のいずれかの完全バージョンを使用するには、ASP.NET アプリケーション サービス データベースをインストールして設定し、そのデータベースに接続する SQL パーソナル化プロバイダを設定する必要があります。詳細については、「SQL Server 向けアプリケーション サービス データベースの作成と構成」を参照してください。また、SQL データベース以外のデータベースやストレージ ソリューションで使用するカスタム プロバイダを作成して設定することもできます。詳細とコード例については、「メンバシップ プロバイダの実装」を参照してください。
Web パーツ ページのカタログに追加するための、WebPart クラスから派生したカスタム Web パーツ コントロール。カスタム WebPart コントロールの例と、ページ内でそれを参照する方法については、WebPartDisplayMode クラスに関するドキュメントの中の TextDisplayWebPart コントロールのコード例を参照してください。
表示モードを変更するユーザー コントロールの作成
このセクションでは、Web パーツ コントロールを含んでいる任意のページに追加でき、ユーザーがさまざまな表示モードに簡単に切り替えられるようにするユーザー コントロールを作成します。
表示モードを変更するユーザー コントロールを作成するには
テキスト エディタで、新しいファイルを作成します。
次のコード例に示すように、ファイルの先頭にコントロール宣言を追加します。
<%@ control language="vb" classname="DisplayModeMenuVB"%>
<%@ control language="C#" classname="DisplayModeMenuCS"%>
ページのコントロール宣言の下に、次のマークアップを追加します。
このマークアップにより、次の 3 つの主要部分から成るコントロールのユーザー インターフェイス (UI) が作成されます。
ユーザーが表示モードを切り替えられるようにするドロップダウン リスト コントロール (<asp:dropdownlist> 要素)。
ユーザーがページ上のユーザー固有のパーソナル化データをリセットして、ページを変更前の既定の外観とレイアウトに戻せるようにするハイパーリンク (<asp:linkbutton> 要素)。
ユーザーがユーザー スコープと共有パーソナル化スコープを切り替えられるようにするオプション ボタン コントロールのペア (2 つの <asp:radiobutton> 要素)。既定はユーザー スコープです。現在のユーザーがページをパーソナル化すると、パーソナル化スコープによって、パーソナル化の結果を表示できるユーザーの範囲が決定されます。
コードは次のコード ブロックのようになります。
<div> <asp:Panel ID="Panel1" runat="server" Borderwidth="1" Width="230" BackColor="lightgray" Font-Names="Verdana, Arial, Sans Serif" > <asp:Label ID="Label1" runat="server" Text=" Display Mode" Font-Bold="true" Font-Size="8" Width="120" AssociatedControlID="DisplayModeDropdown"/> <asp:DropDownList ID="DisplayModeDropdown" runat="server" AutoPostBack="true" Width="120" OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" /> <asp:LinkButton ID="LinkButton1" runat="server" Text="Reset User State" ToolTip="Reset the current user's personalization data for the page." Font-Size="8" OnClick="LinkButton1_Click" /> <asp:Panel ID="Panel2" runat="server" GroupingText="Personalization Scope" Font-Bold="true" Font-Size="8" Visible="false" > <asp:RadioButton ID="RadioButton1" runat="server" Text="User" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" /> <asp:RadioButton ID="RadioButton2" runat="server" Text="Shared" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton2_CheckedChanged" /> </asp:Panel> </asp:Panel> </div>
<div> <asp:Panel ID="Panel1" runat="server" Borderwidth="1" Width="230" BackColor="lightgray" Font-Names="Verdana, Arial, Sans Serif" > <asp:Label ID="Label1" runat="server" Text=" Display Mode" Font-Bold="true" Font-Size="8" Width="120" AssociatedControlID="DisplayModeDropdown"/> <asp:DropDownList ID="DisplayModeDropdown" runat="server" AutoPostBack="true" Width="120" OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" /> <asp:LinkButton ID="LinkButton1" runat="server" Text="Reset User State" ToolTip="Reset the current user's personalization data for the page." Font-Size="8" OnClick="LinkButton1_Click" /> <asp:Panel ID="Panel2" runat="server" GroupingText="Personalization Scope" Font-Bold="true" Font-Size="8" Visible="false" > <asp:RadioButton ID="RadioButton1" runat="server" Text="User" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" /> <asp:RadioButton ID="RadioButton2" runat="server" Text="Shared" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton2_CheckedChanged" /> </asp:Panel> </asp:Panel> </div>
サンプルに使用している言語に基づいてファイルに DisplaymodemenuCS.ascx または DisplaymodemenuVB.ascx という名前を付け、このチュートリアルに使用している仮想ディレクトリまたは Web サイトのフォルダに保存します。
ユーザー コントロールに表示モード機能を追加するには
ユーザー コントロールのソース ファイルで、ページの <div> 開始タグのすぐ上に <script> タグのペアを、<script> 開始タグに runat="server" 属性をそれぞれ追加します。
ユーザーがページの表示モードを変更したり、ページ上のパーソナル化データをリセットしたり、ユーザー スコープと共有パーソナル化スコープを切り替えたりできるようにするためのコードを <script> セクションに追加します。
<script runat="server"> ' Use a field to reference the current WebPartManager. Dim _manager As WebPartManager Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) AddHandler Page.InitComplete, AddressOf InitComplete End Sub Sub InitComplete(ByVal sender As Object, ByVal e As System.EventArgs) _manager = WebPartManager.GetCurrentWebPartManager(Page) Dim browseModeName As String = WebPartManager.BrowseDisplayMode.Name ' Fill the dropdown with the names of supported display modes. Dim mode As WebPartDisplayMode For Each mode In _manager.SupportedDisplayModes Dim modeName As String = mode.Name ' Make sure a mode is enabled before adding it. If mode.IsEnabled(_manager) Then Dim item As New ListItem(modeName, modeName) DisplayModeDropdown.Items.Add(item) End If Next mode ' If shared scope is allowed for this user, display the scope-switching ' UI and select the appropriate radio button for the current user scope. If _manager.Personalization.CanEnterSharedScope Then Panel2.Visible = True If _manager.Personalization.Scope = PersonalizationScope.User Then RadioButton1.Checked = True Else RadioButton2.Checked = True End If End If End Sub ' Change the page to the selected display mode. Sub DisplayModeDropdown_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As EventArgs) Dim selectedMode As String = DisplayModeDropdown.SelectedValue Dim mode As WebPartDisplayMode = _ _manager.SupportedDisplayModes(selectedMode) If Not (mode Is Nothing) Then _manager.DisplayMode = mode End If End Sub ' Set the selected item equal to the current display mode. Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs) Dim items As ListItemCollection = DisplayModeDropdown.Items Dim selectedIndex As Integer = _ items.IndexOf(items.FindByText(_manager.DisplayMode.Name)) DisplayModeDropdown.SelectedIndex = selectedIndex End Sub ' Reset all of a user's personalization data for the page. Protected Sub LinkButton1_Click(ByVal sender As Object, _ ByVal e As EventArgs) _manager.Personalization.ResetPersonalizationState() End Sub ' If not in User personalization scope, toggle into it. Protected Sub RadioButton1_CheckedChanged(ByVal sender As Object, _ ByVal e As EventArgs) If _manager.Personalization.Scope = PersonalizationScope.Shared Then _manager.Personalization.ToggleScope() End If End Sub ' If not in Shared scope, and if user is allowed, toggle the scope. Protected Sub RadioButton2_CheckedChanged(ByVal sender As Object, _ ByVal e As EventArgs) If _manager.Personalization.CanEnterSharedScope AndAlso _ _manager.Personalization.Scope = PersonalizationScope.User Then _manager.Personalization.ToggleScope() End If End Sub </script>
<script runat="server"> // Use a field to reference the current WebPartManager. WebPartManager _manager; void Page_Init(object sender, EventArgs e) { Page.InitComplete += new EventHandler(InitComplete); } void InitComplete(object sender, System.EventArgs e) { _manager = WebPartManager.GetCurrentWebPartManager(Page); String browseModeName = WebPartManager.BrowseDisplayMode.Name; // Fill the dropdown with the names of supported display modes. foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes) { String modeName = mode.Name; // Make sure a mode is enabled before adding it. if (mode.IsEnabled(_manager)) { ListItem item = new ListItem(modeName, modeName); DisplayModeDropdown.Items.Add(item); } } // If shared scope is allowed for this user, display the scope-switching // UI and select the appropriate radio button for the current user scope. if (_manager.Personalization.CanEnterSharedScope) { Panel2.Visible = true; if (_manager.Personalization.Scope == PersonalizationScope.User) RadioButton1.Checked = true; else RadioButton2.Checked = true; } } // Change the page to the selected display mode. void DisplayModeDropdown_SelectedIndexChanged(object sender, EventArgs e) { String selectedMode = DisplayModeDropdown.SelectedValue; WebPartDisplayMode mode = _manager.SupportedDisplayModes[selectedMode]; if (mode != null) _manager.DisplayMode = mode; } // Set the selected item equal to the current display mode. void Page_PreRender(object sender, EventArgs e) { ListItemCollection items = DisplayModeDropdown.Items; int selectedIndex = items.IndexOf(items.FindByText(_manager.DisplayMode.Name)); DisplayModeDropdown.SelectedIndex = selectedIndex; } // Reset all of a user's personalization data for the page. protected void LinkButton1_Click(object sender, EventArgs e) { _manager.Personalization.ResetPersonalizationState(); } // If not in User personalization scope, toggle into it. protected void RadioButton1_CheckedChanged(object sender, EventArgs e) { if (_manager.Personalization.Scope == PersonalizationScope.Shared) _manager.Personalization.ToggleScope(); } // If not in Shared scope, and if user is allowed, toggle the scope. protected void RadioButton2_CheckedChanged(object sender, EventArgs e) { if (_manager.Personalization.CanEnterSharedScope && _manager.Personalization.Scope == PersonalizationScope.User) _manager.Personalization.ToggleScope(); } </script>
次のコードには、いくつか注意点があります。
InitComplete メソッドは、ページで現在使用できる表示モードを決定し、その表示モードをドロップダウン リスト コントロールに読み込みます。また、現在のユーザーがページの共有パーソナル化スコープに入るかどうかを確認し、適切なオプション ボタン コントロールを選択します。
DisplayModeDropdown_SelectedIndexChanged メソッドは、WebPartManager コントロールとユーザーが選択したモードを使用して、ページの表示モードを実際に変更します。
LinkButton1_Click メソッドは、ページのパーソナル化状態をリセットします。つまり、ページのユーザー パーソナル化データがすべてパーソナル化データ ストアから削除され、ページが既定の状態に戻ります。
RadioButton1_CheckChanged メソッドと RadioButton2_CheckChanged メソッドは、パーソナル化スコープをユーザー スコープまたは共有スコープに切り替えます。
ファイルを保存し、閉じます。
表示モード コントロールをホストする Web ページの作成
表示モードを変更するユーザー コントロールを作成したため、ユーザー コントロールをホストする Web ページを作成できるようになりました。また、Web パーツ ゾーンや他のサーバー コントロールを含めて、Web パーツ機能を実装することもできます。
表示モードを変更できる Web ページを作成するには
カスタム コントロールのコンパイル済みアセンブリを Web サイトの Bin フォルダに配置します。
このチュートリアルの必要条件として、コンパイル済みのカスタム WebPart コントロールが必要です。このチュートリアルでは、TextDisplayWebPart という名前のカスタム コントロールを使用します。このコントロールは、WebPartDisplayMode クラスの概要のトピックから入手できます。コンパイル済みアセンブリには、使用する言語に応じて TextDisplayWebPartCS.dll または TextDisplayWebPartVB.dll という名前を付ける必要があります。
セキュリティに関するメモ : このコントロールには、セキュリティ上の脅威をもたらす可能性がある、ユーザー入力を受け入れるテキスト ボックスがあります。既定では、ASP.NET Web ページは、ユーザー入力に HTML 要素またはスクリプトが含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。
テキスト エディタで、新しいファイルを作成します。
ファイルの先頭に、ページ宣言と 2 つの register ディレクティブを追加します。register ディレクティブの 1 つはユーザー コントロール用で、もう 1 つは、このチュートリアルで使用しているコンパイル済みのカスタム WebPart コントロール用です。このディレクティブの Assembly 属性は、カスタム コントロールのアセンブリ ファイルの名前 (拡張子を除く) を参照している必要があります。
<%@ page language="VB" %> <%@ register TagPrefix="uc1" TagName="DisplayModeMenuVB" Src="DisplayModeMenuVB.ascx" %> <%@ register tagprefix="aspSample" Namespace="Samples.AspNet.VB.Controls" Assembly="TextDisplayWebPartVB"%>
<%@ page language="C#" %> <%@ register TagPrefix="uc1" TagName="DisplayModeMenuCS" Src="DisplayModeMenuCS.ascx" %> <%@ register tagprefix="aspSample" Namespace="Samples.AspNet.CS.Controls" Assembly="TextDisplayWebPartCS"%>
register ディレクティブの下に次のコード ブロックを追加して、ページを手動でカタログ モードに切り替えられるようにします。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Sub Button1_Click(Byval sender As Object, _ ByVal e As EventArgs) WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode End Sub </script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> void Button1_Click(object sender, EventArgs e) { WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode; } </script>
ファイルのこのコード ブロックの後に、次のマークアップを追加します。
このコード例には、<asp:webpartmanager> 要素、ページで使用できる表示モードに対応する Web パーツ ゾーン、およびいくつかのコントロールなど、Web パーツ ページに必要な機能が多数含まれています。それらの詳細については、「チュートリアル : Web パーツ ページの作成」を参照してください。
ページの残りのコードは、次のコード ブロックのようになります。
<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Web Parts Display Modes</title> </head> <body> <form id="Form2" runat="server"> <asp:webpartmanager id="WebPartManager1" runat="server" /> <uc1:DisplayModeMenuVB ID="DisplayModeMenu1" runat="server" /> <asp:webpartzone id="WebPartZone1" runat="server" BackImageUrl="~/MyImage.gif"> <zonetemplate> <asp:Calendar ID="Calendar1" Runat="server" Title="My Calendar" /> </zonetemplate> </asp:webpartzone> <asp:WebPartZone ID="WebPartZone2" Runat="server"> </asp:WebPartZone> <asp:EditorZone ID="editzone1" Runat="server"> <ZoneTemplate> <asp:AppearanceEditorPart ID="appearanceeditor1" Runat="server" /> <asp:LayoutEditorPart ID="LayoutEditorPart1" Runat="server" /> </ZoneTemplate> </asp:EditorZone> <asp:CatalogZone ID="catalogzone1" Runat="server"> <ZoneTemplate> <asp:DeclarativeCatalogPart ID="declarativepart1" Runat="server"> <WebPartsTemplate> <aspSample:TextDisplayWebPart runat="server" id="textwebpart" title = "Text Content WebPart"/> </WebPartsTemplate> </asp:DeclarativeCatalogPart> </ZoneTemplate> </asp:CatalogZone> <br /> <asp:button id="button1" runat="server" text="Catalog Mode" OnClick="Button1_Click" /> </form> </body> </html>
<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Web Parts Display Modes</title> </head> <body> <form id="Form2" runat="server"> <asp:webpartmanager id="WebPartManager1" runat="server" /> <uc1:DisplayModeMenuCS ID="DisplayModeMenu1" runat="server" /> <asp:webpartzone id="WebPartZone1" runat="server" BackImageUrl="~/MyImage.gif"> <zonetemplate> <asp:Calendar ID="Calendar1" Runat="server" Title="My Calendar" /> </zonetemplate> </asp:webpartzone> <asp:WebPartZone ID="WebPartZone2" Runat="server"> </asp:WebPartZone> <asp:EditorZone ID="editzone1" Runat="server"> <ZoneTemplate> <asp:AppearanceEditorPart ID="appearanceeditor1" Runat="server" /> <asp:LayoutEditorPart ID="LayoutEditorPart1" Runat="server" /> </ZoneTemplate> </asp:EditorZone> <asp:CatalogZone ID="catalogzone1" Runat="server"> <ZoneTemplate> <asp:DeclarativeCatalogPart ID="declarativepart1" Runat="server"> <WebPartsTemplate> <aspSample:TextDisplayWebPart runat="server" id="textwebpart" title = "Text Content WebPart" AllowClose="true"/> </WebPartsTemplate> </asp:DeclarativeCatalogPart> </ZoneTemplate> </asp:CatalogZone> <br /> <asp:button id="button1" runat="server" text="Catalog Mode" OnClick="Button1_Click" /> </form> </body> </html>
ファイルに Displaymodes.aspx という名前を付け、Web サイトのディレクトリに保存します。
表示モードを変更する Web ページのテスト
これで、Web パーツ コントロールを含み、さまざまなページ表示モードに切り替えることができる Web ページの実行に必要なすべてのものを作成できました。
ページをテストして表示モードを変更するには
ページをブラウザに読み込みます。
ページは次のスクリーン ショットのようになります。
表示モードを変更するコントロールを含んだページ
[表示モード] ドロップダウン リスト コントロールをクリックします。
ページには多様な表示モードが使用できます。このページは WebPartZone、EditorZone、および CatalogZone の各コントロールを含んでいるため、既定の [Browse] 表示モードに加えてこれらの種類のゾーンに対応する表示モードがドロップダウン リストに表示されます。
メモ : ConnectionsZone コントロールをページに追加して、コントロールを接続できるようにし、ドロップダウン リストに接続表示モードを追加することもできます。ただし、接続については、このチュートリアルでは説明しません。
ドロップダウン リストの [カタログ] モードを選択します。
カタログ モードの UI が表示され、ページに追加できる TextDisplayWebPart コントロールがカタログに表示されます。
[閉じる] をクリックして、ページをブラウズ モードに戻します。
または、ページの下部にある [Catalog Mode] をクリックすると、このユーザー コントロールを使用せずに表示モードを切り替えることができます。この切り替えのためのコードは、Web ページの Button1_Click メソッドにあります。
ページがカタログ モードに切り替わります。
カタログのカスタム コントロールの横にあるチェック ボックスをオンにして [追加] をクリックすると、そのコントロールがページに追加されます。
[閉じる] をクリックして、ページをブラウズ モードに戻します。
追加したコントロールがページに表示されます。
[表示モード] ドロップダウン リスト コントロールの [編集] をクリックします。
ページが編集モードに切り替わります。ゾーンのタイトルが表示され、WebPartZone にある各サーバー コントロールのタイトル バーに、小さな三角形のような動詞メニュー ボタンが表示されます。動詞メニューには、ユーザーがコントロールに適用できるさまざまな操作が用意されています。
TextDisplayWebPart コントロールの動詞メニューをクリックします。
ドロップダウン メニューが表示されます。
動詞メニューの [編集] をクリックします。
<asp:editorzone> 要素内で宣言されている特別な編集 UI が表示されます。これらのコントロールを使用して、カスタム コントロールのレイアウトと外観を変更できます。
編集 UI を使用して、カスタム コントロールのタイトルを変更します。[適用] をクリックして変更内容を適用します。
カスタム コントロールのタイトル バーの上にマウス ポインタを置きます。タイトル バーをクリックし、コントロールを WebPartZone1 から WebPartZone2 にドラッグします。
[表示モード] ドロップダウン リスト コントロールを使用して、ページをブラウズ モードに戻します。
ページは次のスクリーン ショットのようになります。
さまざまな表示モードで変更した後のページ