Пошаговое руководство. Реализация персонализации веб-частей с помощью IPersonalizable
Обновлен: Ноябрь 2007
В данном пошаговом руководстве демонстрируется предоставление значений по умолчанию, связанных с определенным пользователем, с помощью реализации пользовательского элемента управления в качестве элемента управления веб-частей.
Наиболее важной чертой такого элемента управления является то, что его персонализируемые свойства хранятся в переменных незначимого типа. В этом случае значения сохраняются в элементе управления BulletedList. Это предполагает, что у системы нет возможности определить момент изменения пользователем значений в списке. В этом пошаговом руководстве показано, как сообщить системе об изменении значений, чтобы их можно было сохранить для последующего использования. Это может быть удобно при создании настраиваемых интерактивных форм для каждого из пользователей. Персонализация веб-частей позволяет системе распознавать пользователя для автоматического восстановления значений его формы при последующих посещениях данного веб-узла.
Примечание. |
---|
Создаваемый в данном пошаговом руководстве пользовательский элемент управления не наследует от класса WebPart; однако пользовательский элемент управления может выступать в качестве элемента управления WebPart. В процессе выполнения этого пошагового руководства пользовательский элемент управления добавляется в зону WebPartZoneBase. Это позволяет ASP.NET перенести пользовательский элемент управления в элемент управления GenericWebPart. Тогда пользовательский элемент управления будет работать как любой другой элемент управления WebPart и позволит работать с персонализацией. |
В процессе выполнения этого пошагового руководства вы научитесь:
Создавать пользовательские элементы управления с персонализируемыми свойствами, значения которых могут сохраняться на протяжении длительного времени.
Отображать значения по умолчанию, связанные с определенным пользователем.
Работать с пользовательским элементом управления в области, как с обычным элементом управления WebPart.
Примечание. |
---|
Такой тип приложений можно разрабатывать при помощи профилей ASP.NET. Однако в таком случае информация о пользователе, которая может быть использована во всем приложении, как, например, в приложении корзины покупок, не сохраняется. Вместо этого сохраняются предпочтения или параметры каждого элемента управления для каждого пользователя на каждой странице по отдельности. Дополнительные сведения о профилях см. в разделе Общие сведения о свойствах профилей ASP.NET. |
Обязательные компоненты
Для выполнения данного пошагового руководства потребуется следующее.
Службы IIS (IIS), установленные и настроенные на компьютере, на котором будет размещен узел. Подробные сведения об установке и настройке IIS содержатся в справочной документации IIS, включенной в состав установки, или в электронной документации IIS на узле Microsoft TechNet (Internet Information Services 6.0 Technical Resources).
Веб-узел ASP.NET, идентифицирующий отдельных пользователей. Если такой узел уже настроен, то можно использовать его в качестве отправной точки для данного пошагового руководства. В противном случае см. дополнительные сведения о создании виртуального каталога или узла в разделе Практическое руководство. Создание и настройка виртуальных каталогов в IIS 5.0 и 6.0.
Настроенные поставщик персонализации и база данных. По умолчанию персонализация веб-частей включена и использует поставщика персонализации SQL (SqlPersonalizationProvider) вместе с Microsoft SQL Server Standard Edition (SSE) для хранения данных персонализации. В данном пошаговом руководстве используется SSE и стандартный поставщик SQL. При наличии установленного SSE настройка не требуется. SSE входит в состав Microsoft Visual Studio 2005 как необязательная часть установки доступен для загрузки с узла Microsoft.com. Для использования одной из полных версий SQL Server необходимо установить и настроить базу данных служб приложения ASP.NET и настроить поставщика персонализации SQL для подключения к этой базе данных. Дополнительные сведения см. в разделе Создание и настройка базы данных служб приложения для SQL Server. Можно также создать и настроить пользовательский поставщик для использования с другими решениями, не являющимися базами данных или хранилищами SQL. Дополнительные сведения и примеры исходного кода см. в разделе Реализация поставщика членства.
Создание персонализируемого пользовательского элемента управления, содержащего переменные ссылочного типа
В данной части пошагового руководства создается пользовательский элемент управления, позволяющий вводить для веб-узла понятное имя и URL-адрес. При нажатии кнопки Сохранить понятное имя добавляется в элемент управления BulletedList. Эти значения сохраняются функцией персонализации веб-частей для конкретных пользователей. Каждый раз, когда пользователь обращается к элементу управления с другой страницы или в новом сеансе, система отображает сохраненные значения BulletedList.
Примечание. |
---|
Для включения персонализации веб-частей не нужно ничего делать, она включена по умолчанию. Дополнительные сведения о персонализации см. в разделе Общие сведения о персонализации веб-частей. |
Создание персонализируемого пользовательского элемента
Создайте в текстовом редакторе новый файл для пользовательского элемента управления, назовите его UrlList.ascx и сохраните в своем веб-каталоге. Код, реализующий функциональность элемента управления, содержится в отдельном файле, как показано в шаге 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" %>
Под директивой добавьте следующие элементы, представляющие пользовательский интерфейс элемента управления.
<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.vb или UrlList.ascx.cs в зависимости от используемого языка), реализующий функциональность предшествующего элемента управления UrlList.ascx. Этот код поделен на две части. В одной части содержится код, обрабатывающий вводимые пользователем данные и событие загрузки страницы; в другой содержится код, реализующий интерфейс 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 (в зависимости от используемого языка) и сохраните его в корневом каталоге веб-узла.
Примечание о безопасности. Этот элемент управления содержит текстовое поле, принимающее данные, вводимые пользователем, что является потенциальной угрозой безопасности. В данных, вводимых пользователем на веб-странице, может содержаться вредоносный клиентский сценарий. По умолчанию веб-страницы ASP.NET проверяют введенные пользователем данные на предмет наличия в них HTML-элементов или сценариев. Пока эта проверка включена, нет необходимости в явном виде проверять вводимые пользователем данные на предмет наличия сценариев или элементов HTML. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.
Ссылка на пользовательский элемент управления, как на элемент управления веб-частей
После создания пользовательского элемента управления с персонализируемыми свойствами можно создать страницу веб-форм для размещения пользовательского элемента управления в виде элемента управления веб-частей.
Примечание. |
---|
Чтобы персонализация работала, необходимо разместить элемент управления как элемент управления веб-частей. |
Ссылка на пользовательский элемент управления, как на элемент управления веб-частей
Создайте новый файл в текстовом редакторе. В начало файла добавьте объявление страницы, как показано в следующем примере.
<%@ page language="VB" %>
<%@ page language="C#" %>
Под объявлением страницы добавьте объявление, чтобы создать ссылку на созданный ранее пользовательский элемент управления, как показано в следующем примере.
<%@ Register tagprefix="UserControl" tagname="UrlList" src="UrlList.ascx" %>
<%@ Register tagprefix="UserControl" tagname="UrlList" src="UrlList.ascx" %>
Под ссылкой на элемент управления добавьте следующую структуру базовой страницы, чтобы разместить пользовательский элемент управления как элемент управления веб-частей.
Примечание. Чтобы пользовательский элемент управления работал как элемент управления веб-частей, страница должна содержать элемент <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 и сохраните его в одном каталоге с пользовательским элементом управления.
В результате выполнения описанных действий был создан персонализируемый пользовательский элемент управления со ссылкой на него как на элемент управления веб-частей на странице веб-форм.
Последним шагом является проверка этого пользовательского элемента.
Проверка пользовательского элемента управления
Загрузите страницу UrlList.aspx в обозревателе.
Введите значения в полях Имя и URL-адрес и нажмите кнопку Сохранить значения формы.
Закройте обозреватель.
Снова загрузите веб-страницу в обозревателе.
Введенные ранее значения должны появиться в форме. Это те значения, которые были сохранены в элементе управления BulletedList и были восстановлены из базы данных при перезагрузке страницы в обозревателе.
Введите новые значения в поля формы, но не нажимайте кнопку сохранения. Закройте обозреватель.
Снова загрузите веб-страницу в обозревателе. В форме снова должны отобразиться исходные значения, введенные и сохраненные в персонализированных свойствах.
Следующие действия
В данном пошаговом руководстве продемонстрированы основные задачи, участвующие в создании пользовательского элемента управления с персонализируемыми свойствами. Был создан элемент управления, который позволяет сохранять параметры каждого пользователя для отдельного элемента управления и страницы и впоследствии отображать сохраненные параметры при последующих посещениях страницы пользователем во время нового сеанса обозревателя. В качестве дополнительного материала рекомендуется изучить следующее:
Другие компоненты, используемые при создании страницы веб-частей. Общие сведения см. в разделе Пошаговое руководство. Создание страницы веб-частей.
Более подробная информация о пользовательских элементах управления. Дополнительные сведения см. в разделе Общие сведения о пользовательских элементах управления ASP.NET.
Создание собственных пользовательских элементов управления веб-частей, предоставляющих расширенный программный контроль по сравнению с пользовательскими элементами управления и доступ ко всем функциям веб-частей. Дополнительные сведения см. в разделе Практическое руководство. Интерпретация пользовательского элемента управления как элемента управления веб-частей.