Поделиться через


WebPartManager.IPersonalizable.IsDirty Свойство

Определение

Возвращает значение, которое указывает, были ли изменены на веб-страницы данные состояния персонализации, управляемые элементом управления WebPartManager.

property bool System::Web::UI::WebControls::WebParts::IPersonalizable::IsDirty { bool get(); };
bool System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty { get; }
member this.System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty : bool
 ReadOnly Property IsDirty As Boolean Implements IPersonalizable.IsDirty

Значение свойства

Логическое значение, которое указывает, были ли изменены данные состояния персонализации.

Реализации

Примеры

В следующем примере кода демонстрируется простое использование IPersonalizable.IsDirty свойства , чтобы указать некоторые распространенные экземпляры персонализации страницы, которые приводят WebPartManager к изменению данных персонализации элемента управления.

Пример кода состоит из четырех частей:

  • Пользовательский элемент управления, позволяющий изменять режимы отображения на странице, содержащей элементы управления веб-частей.

  • Исходный файл, содержащий код для двух настраиваемых WebPart элементов управления, которые можно подключить, и интерфейс.

  • Веб-страница, на котором размещаются все элементы управления.

  • Объяснение того, как работает пример кода.

Первая часть примера кода — это пользовательский элемент управления для изменения режимов отображения. Исходный код для пользовательского элемента управления можно получить в разделе WebPartManager Пример обзора класса. Сведения о режимах отображения и работе пользовательского элемента управления см. в разделе Пошаговое руководство. Изменение режимов отображения на странице веб-частей.

Вторая часть примера — исходный файл с пользовательскими элементами управления и интерфейсом . Обратите внимание, что IZipCode интерфейс предоставляет один метод и что этот метод, реализованный в пользовательском ZipCodeWebPart элементе управления, служит методом обратного вызова, чтобы позволить ZipCodeWebPart действовать в качестве поставщика в сценарии подключения. Другой элемент управления , WeatherWebPart, выступает в качестве элемента управления потребителя в соединении; он может использовать определенный интерфейс, предоставляемый .ZipCodeWebPart В реальном приложении WeatherWebPart может использовать персонализированное значение почтового индекса от поставщика, а затем предоставлять пользователям графические сведения о погоде.

Чтобы выполнить пример кода, необходимо скомпилировать этот исходный код. Вы можете скомпилировать его явным образом и поместить полученную сборку в папку Bin веб-сайта или глобальный кэш сборок. Кроме того, исходный код можно поместить в папку App_Code сайта, где он будет динамически компилироваться во время выполнения. В этом примере кода используется динамическая компиляция; Поэтому обратите внимание, что директива Register для этого компонента в верхней части веб-страницы содержит только TagPrefix атрибуты и Namespace без атрибута Assembly . Пошаговое руководство по компиляции см. в разделе Пошаговое руководство. Разработка и использование пользовательского серверного веб-элемента управления.

namespace Samples.AspNet.CS.Controls
{
  using System;
  using System.Web;
  using System.Web.Security;
  using System.Security.Permissions;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public interface IZipCode
  {
    string ZipCode { get; set;}
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class ZipCodeWebPart : WebPart, IZipCode
  {
    string zipCodeText = String.Empty;
    TextBox input;
    Button send;

    public ZipCodeWebPart()
    {
    }

    // Make the implemented property personalizable to save 
    // the Zip Code between browser sessions.
    [Personalizable()]
    public virtual string ZipCode
    {
      get { return zipCodeText; }
      set { zipCodeText = value; }
    }

    // This is the callback method that returns the provider.
    [ConnectionProvider("Zip Code", "ZipCodeProvider")]
    public IZipCode ProvideIZipCode()
    {
      return this;
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      input = new TextBox();
      this.Controls.Add(input);
      send = new Button();
      send.Text = "Enter 5-digit Zip Code";
      send.Click += new EventHandler(this.submit_Click);
      this.Controls.Add(send);
    }

    private void submit_Click(object sender, EventArgs e)
    {
      if (!string.IsNullOrEmpty(input.Text))
      {
        zipCodeText = Page.Server.HtmlEncode(input.Text);
        input.Text = String.Empty;
      }
    }
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class WeatherWebPart : WebPart
  {
    private IZipCode _provider;
    string _zipSearch;
    Label DisplayContent;

    // This method is identified by the ConnectionConsumer 
    // attribute, and is the mechanism for connecting with 
    // the provider. 
    [ConnectionConsumer("Zip Code", "ZipCodeConsumer")]
    public void GetIZipCode(IZipCode Provider)
    {
      _provider = Provider;
    }
    
    protected override void OnPreRender(EventArgs e)
    {
      EnsureChildControls();

      if (this._provider != null)
      {
        _zipSearch = _provider.ZipCode.Trim();
        DisplayContent.Text = "My Zip Code is:  " + _zipSearch;
      }
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      DisplayContent = new Label();
      this.Controls.Add(DisplayContent);
    }
  }
}
Imports System.Web
Imports System.Web.Security
Imports System.Security.Permissions
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Interface IZipCode

    Property ZipCode() As String

  End Interface

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class ZipCodeWebPart
    Inherits WebPart
    Implements IZipCode
    Private zipCodeText As String = String.Empty
    Private input As TextBox
    Private send As Button

    Public Sub New()
    End Sub

    ' Make the implemented property personalizable to save 
    ' the Zip Code between browser sessions.
    <Personalizable()> _
    Public Property ZipCode() As String _
      Implements IZipCode.ZipCode

      Get
        Return zipCodeText
      End Get
      Set(ByVal value As String)
        zipCodeText = value
      End Set
    End Property

    ' This is the callback method that returns the provider.
    <ConnectionProvider("Zip Code", "ZipCodeProvider")> _
    Public Function ProvideIZipCode() As IZipCode
      Return Me
    End Function


    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      input = New TextBox()
      Me.Controls.Add(input)
      send = New Button()
      send.Text = "Enter 5-digit Zip Code"
      AddHandler send.Click, AddressOf Me.submit_Click
      Me.Controls.Add(send)

    End Sub


    Private Sub submit_Click(ByVal sender As Object, _
      ByVal e As EventArgs)

      If input.Text <> String.Empty Then
        zipCodeText = Page.Server.HtmlEncode(input.Text)
        input.Text = String.Empty
      End If

    End Sub

  End Class

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class WeatherWebPart
    Inherits WebPart
    Private _provider As IZipCode
    Private _zipSearch As String
    Private DisplayContent As Label

    ' This method is identified by the ConnectionConsumer 
    ' attribute, and is the mechanism for connecting with 
    ' the provider. 
    <ConnectionConsumer("Zip Code", "ZipCodeConsumer")> _
    Public Sub GetIZipCode(ByVal Provider As IZipCode)
      _provider = Provider
    End Sub


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
      EnsureChildControls()

      If Not (Me._provider Is Nothing) Then
        _zipSearch = _provider.ZipCode.Trim()
                DisplayContent.Text = "My Zip Code is:  " + _zipSearch
      End If

    End Sub

    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      DisplayContent = New Label()
      Me.Controls.Add(DisplayContent)

    End Sub

  End Class

End Namespace

Третья часть примера кода — веб-страница. Обратите внимание, что он содержит две WebPartZone зоны, а первая — два настраиваемых WebPart элемента управления. Существует также CatalogZone зона, которая содержит стандартный Calendar элемент управления, который пользователи могут добавлять на страницу. Элемент <asp:connectionszone> предоставляет пользователям пользовательский интерфейс подключения для создания соединений между элементами управления. В методе Page_PreRender обратите внимание, что он проверяет, изменились ли данные персонализации, и, если да, обновляет текст Label1.

<%@ Page Language="C#" %>
<%@ Register TagPrefix="uc1" 
    TagName="DisplayModeMenuCS"
    Src="~/displaymodemenucs.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  protected void Page_PreRender(object sender, EventArgs e)
  {
    // Clear the label if it has a previously set value.
    Label1.Text = String.Empty;
    
    // Cast the WebPartManager to the IPersonalizable interface 
    // so that you can access the property.  
    IPersonalizable stateData = (IPersonalizable)mgr1;
    if (stateData.IsDirty)
      Label1.Text = "WebPartManager personalization data is dirty.";
  }
    
  protected void Button1_Click(object sender, EventArgs e)
  {
    ProviderConnectionPoint provPoint = 
      mgr1.GetProviderConnectionPoints(zip1)["ZipCodeProvider"];
    ConsumerConnectionPoint connPoint = 
      mgr1.GetConsumerConnectionPoints(weather1)["ZipCodeConsumer"];
    WebPartConnection conn1 = mgr1.ConnectWebParts(zip1, provPoint,
      weather1, connPoint);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr1" runat="server" />
      <uc1:DisplayModeMenuCS ID="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider" />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:WebPartZone ID="WebPartZone2" runat="server">
        <ZoneTemplate>
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:CatalogZone ID="CatalogZone1" runat="server">
        <ZoneTemplate>
          <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1" 
            runat="server">
            <WebPartsTemplate>
              <asp:Calendar ID="Calendar1" runat="server" 
                Title="My Calendar" />
            </WebPartsTemplate>
          </asp:DeclarativeCatalogPart>
          <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
        </ZoneTemplate>
      </asp:CatalogZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server" />
      <asp:Button ID="Button1" runat="server" 
        Text="Connect WebPart Controls" 
        OnClick="Button1_Click" />
      <hr />
      <asp:Label ID="Label1" runat="server" 
        Text="" 
        Font-Bold="true" />
    </div>
    </form>
</body>
</html>
<%@ Page Language="vb" %>
<%@ Register TagPrefix="uc1" 
    TagName="DisplayModeMenuVB"
    Src="~/displaymodemenuvb.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.VB.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  Protected Sub Page_PreRender(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    
    ' Clear the label if it has a previously set value.
    Label1.Text = String.Empty
    
    ' Cast the WebPartManager to the IPersonalizable interface 
    ' so that you can access the property.
    Dim stateData As IPersonalizable = CType(mgr1, IPersonalizable)
    If stateData.IsDirty Then
      Label1.Text = "WebPartManager personalization data is dirty."
    End If
    
  End Sub
    
  Protected Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs)

    Dim provPoint As ProviderConnectionPoint = _
      mgr1.GetProviderConnectionPoints(zip1)("ZipCodeProvider")
    Dim connPoint As ConsumerConnectionPoint = _
      mgr1.GetConsumerConnectionPoints(weather1)("ZipCodeConsumer")
    Dim conn1 As WebPartConnection = _
      mgr1.ConnectWebParts(zip1, provPoint, weather1, connPoint)
      
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr1" runat="server" />
      <uc1:DisplayModeMenuVB ID="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider" />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:WebPartZone ID="WebPartZone2" runat="server">
        <ZoneTemplate>
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:CatalogZone ID="CatalogZone1" runat="server">
        <ZoneTemplate>
          <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1" 
            runat="server">
            <WebPartsTemplate>
              <asp:Calendar ID="Calendar1" runat="server" 
                Title="My Calendar" />
            </WebPartsTemplate>
          </asp:DeclarativeCatalogPart>
          <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
        </ZoneTemplate>
      </asp:CatalogZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server" />
      <asp:Button ID="Button1" runat="server" 
        Text="Connect WebPart Controls" 
        OnClick="Button1_Click" />
      <hr />
      <asp:Label ID="Label1" runat="server" 
        Text="" 
        Font-Bold="true" />
    </div>
    </form>
</body>
</html>

После загрузки страницы в браузере попробуйте создать некоторые сценарии, перечисленные в разделе Примечания этого раздела, которые изменят данные персонализации. При внесении различных изменений, когда изменение включает в себя один из сценариев персонализации, отслеживаемых элементом WebPartManager управления, отображается текст элемента управления, указывающий Label1 на изменение данных персонализации. Например, администратор может сделать следующее:

  • Создайте подключение между элементами управления, нажав кнопку Подключить элементы управления веб-части .

  • Используйте элемент управления раскрывающийся список режим отображения , чтобы переключить страницу в режим каталога и добавить элемент управления Мой календарь во вторую WebPartZone зону.

  • Переведите страницу обратно в режим обзора, щелкните меню глаголов (в заголовке окна отображается символ со стрелкой) для элемента управления Мой календарь и нажмите кнопку Закрыть , чтобы закрыть его и добавить в каталог страниц.

  • Верните страницу в режим каталога и добавьте элемент управления Мой календарь обратно на страницу.

  • Используйте элемент управления Режим отображения для переключения страницы в режим конструктора и переупорядочения макета элементов управления путем перетаскивания одного или нескольких элементов в другую зону или в другое положение в той же зоне.

Комментарии

Свойство IPersonalizable.IsDirty позволяет вызывающим абонентам определить, изменились ли данные состояния персонализации, управляемые элементом WebPartManager управления. Когда пользователи персонализуют сведения на уровне страницы, например путем изменения макета страницы, создания или удаления подключений, а также добавления или удаления элементов управления, данные персонализации, управляемые элементом WebPartManager управления, изменяются. Это сквозной метод, который возвращает вызывающим объектам значение защищенного IsCustomPersonalizationStateDirty свойства, к которому вызывающие объекты не могут получить прямой доступ.

Примечание

Свойство IPersonalizable.IsDirty не указывает, были ли изменены персонализированные значения свойств или отдельные свойства, влияющие на внешний вид отдельных WebPart элементов управления. Персонализация на уровне элемента управления отслеживается для каждого элемента управления по отдельности. Свойство IPersonalizable.IsDirty указывает только, изменились ли данные персонализации, которые на уровне страницы и управляются элементом WebPartManager управления.

В следующем списке описаны некоторые распространенные случаи персонализации, которые приводят к тому IPersonalizable.IsDirty , что свойство возвращает значение true, указывающее, что WebPartManager элемент управления имеет измененные данные персонализации:

  • Закрытие статического WebPart элемента управления (или серверного или пользовательского элемента управления) на странице.

  • Восстановление закрытого статического WebPart элемента управления из каталога страниц обратно на страницу.

  • Перемещение любого элемента управления в пределах своей зоны или в другую зону.

  • Добавление элемента управления из каталога или серверных WebPart элементов управления или добавление элемента управления программным способом.

  • Создание соединения между двумя WebPart элементами управления программными средствами или с помощью пользовательского интерфейса подключения.

  • Удаление соединения между двумя WebPart элементами управления программными средствами или с помощью пользовательского интерфейса подключения.

Чтобы получить доступ к этому значению свойства, необходимо привести WebPartManager экземпляр элемента управления к интерфейсу IPersonalizable . Затем можно прочитать IsDirty значение свойства.

Применяется к

См. также раздел