Udostępnij za pośrednictwem


WebPartManager.IPersonalizable.IsDirty Właściwość

Definicja

Pobiera wartość wskazującą, czy niestandardowe dane stanu personalizacji zarządzane przez WebPartManager kontrolkę zmieniły się na stronie sieci Web.

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

Wartość właściwości

Wartość logiczna wskazująca, czy dane stanu personalizacji uległy zmianie.

Implementuje

Przykłady

Poniższy przykład kodu przedstawia proste użycie IPersonalizable.IsDirty właściwości, aby wskazać niektóre typowe wystąpienia personalizacji strony, które powodują zmianę WebPartManager danych personalizacji kontrolki.

Przykładowy kod ma cztery części:

  • Kontrolka użytkownika, która umożliwia zmianę trybów wyświetlania na stronie zawierającej kontrolki składników Web Part.

  • Plik źródłowy zawierający kod dwóch kontrolek niestandardowych WebPart , które można połączyć, i interfejs.

  • Strona sieci Web, która hostuje wszystkie kontrolki.

  • Wyjaśnienie działania przykładu kodu.

Pierwszą częścią przykładu kodu jest kontrolka użytkownika do zmieniania trybów wyświetlania. Kod źródłowy kontrolki użytkownika można uzyskać w sekcji Przykład w przeglądzie WebPartManager klasy. Aby uzyskać informacje o trybach wyświetlania i sposobie działania kontrolki użytkownika, zobacz Przewodnik: zmienianie trybów wyświetlania na stronie składników Web Part.

Drugą częścią przykładu jest plik źródłowy z kontrolkami niestandardowymi i interfejsem. Zwróć uwagę, że IZipCode interfejs uwidacznia jedną metodę i że ta metoda jako zaimplementowana w kontrolce niestandardowej ZipCodeWebPart służy jako metoda wywołania zwrotnego, aby umożliwić ZipCodeWebPart działanie jako dostawca w scenariuszu połączenia. Druga kontrolka , WeatherWebPartdziała jako kontrolka konsumenta w połączeniu; może korzystać z określonego interfejsu dostarczonego przez ZipCodeWebPartprogram . W rzeczywistej aplikacji WeatherWebPart może korzystać z spersonalizowanej wartości kodu POCZTOWEgo od dostawcy, a następnie udostępniać użytkownikom graficzne informacje o pogodzie.

Aby można było uruchomić przykładowy kod, należy skompilować ten kod źródłowy. Można je skompilować jawnie i umieścić wynikowy zestaw w folderze Bin witryny sieci Web lub globalnej pamięci podręcznej zestawów. Alternatywnie można umieścić kod źródłowy w folderze App_Code witryny, w którym będzie dynamicznie kompilowany w czasie wykonywania. W tym przykładzie kodu jest używana kompilacja dynamiczna; dlatego należy zauważyć, że Register dyrektywa dla tego składnika w górnej części strony sieci Web zawiera tylko TagPrefix i Namespace atrybuty, bez atrybutu Assembly . Aby zapoznać się z przewodnikiem, który pokazuje sposób kompilowania, zobacz Przewodnik: tworzenie i używanie niestandardowej kontrolki serwera sieci Web.

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

Trzecią częścią przykładu kodu jest strona internetowa. Zwróć uwagę, że zawiera ona dwie WebPartZone strefy z pierwszą zawierającą dwa kontrolki niestandardowe WebPart . Istnieje również strefa zawierająca standardową Calendar kontrolkęCatalogZone, którą użytkownicy mogą dodawać do strony. Element <asp:connectionszone> udostępnia interfejs użytkownika połączenia dla użytkowników w celu tworzenia połączeń między kontrolkami. W metodzie Page_PreRender zwróć uwagę, że sprawdza, czy dane personalizacji uległy zmianie, a jeśli tak, aktualizuje tekst .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>

Po załadowaniu strony w przeglądarce spróbuj utworzyć niektóre scenariusze wymienione w sekcji Uwagi tego tematu, które zmienią dane personalizacji. Podczas wprowadzania różnych zmian, gdy zmiana obejmuje jeden ze scenariuszy personalizacji śledzonych przez kontrolkę WebPartManager , tekst Label1 kontrolki jest wyświetlany w celu wskazania, że dane personalizacji uległy zmianie. Możesz na przykład:

  • Utwórz połączenie między kontrolkami, klikając przycisk Połącz kontrolki składników Web Part .

  • Użyj kontrolki listy rozwijanej Tryb wyświetlania , aby przełączyć stronę do trybu wykazu i dodać kontrolkę Mój kalendarz do drugiej WebPartZone strefy.

  • Zmień stronę z powrotem na tryb przeglądania, kliknij menu czasowników (wyświetlane z symbolem strzałki na pasku tytułu) dla kontrolki Mój kalendarz , a następnie wybierz pozycję Zamknij , aby go zamknąć i dodać do wykazu stron.

  • Zwróć stronę do trybu wykazu i dodaj kontrolkę Mój kalendarz z powrotem do strony.

  • Użyj kontrolki Tryb wyświetlania , aby przełączyć stronę do trybu projektowania i zmienić układ kontrolek, przeciągając co najmniej jedną z nich do innej strefy lub do innej pozycji w tej samej strefie.

Uwagi

Właściwość IPersonalizable.IsDirty umożliwia obiektom wywołującym określenie, czy dane stanu personalizacji zarządzane przez kontrolkę WebPartManager uległy zmianie. Gdy użytkownicy spersonalizuje szczegóły na poziomie strony, na przykład zmieniając układ strony, tworząc lub usuwając połączenia oraz dodając lub usuwając kontrolki, dane personalizacji zarządzane przez WebPartManager zmiany kontrolki. Jest to metoda przekazywania, która powraca do elementów wywołujących wartość chronionej IsCustomPersonalizationStateDirty właściwości, do której nie można uzyskać bezpośredniego dostępu przez obiekty wywołujące.

Uwaga

Właściwość IPersonalizable.IsDirty nie wskazuje, czy wartości właściwości z możliwością personalizacji, czy poszczególne właściwości wpływające na wygląd poszczególnych WebPart kontrolek, uległy zmianie. Personalizacja na poziomie kontroli jest śledzona dla każdej kontrolki osobno. Właściwość IPersonalizable.IsDirty wskazuje tylko, czy dane personalizacji, które są na poziomie strony i są zarządzane przez kontrolkę WebPartManager , uległy zmianie.

Poniższa lista zawiera opis niektórych typowych wystąpień personalizacji, które mogłyby spowodować IPersonalizable.IsDirty zwrócenie przez właściwość wartości true, co oznacza, że kontrolka WebPartManager zmieniła dane personalizacji:

  • Zamykanie statycznej WebPart kontrolki (serwera lub kontrolki użytkownika) na stronie.

  • Przywracanie zamkniętej kontrolki statycznej WebPart z wykazu stron z powrotem do strony.

  • Przeniesienie dowolnej kontrolki w jej strefie lub do innej strefy.

  • Dodawanie kontrolki z katalogu kontrolek lub serwerów WebPart albo programowe dodawanie kontrolki.

  • Tworzenie połączenia między dwiema WebPart kontrolkami — programowo lub przy użyciu interfejsu użytkownika połączenia.

  • Usuwanie połączenia między dwiema WebPart kontrolkami — programowo lub przy użyciu interfejsu użytkownika połączenia.

Aby uzyskać dostęp do tej wartości właściwości, musisz rzutować wystąpienie kontrolki WebPartManager do interfejsu IPersonalizableIsDirty . Następnie możesz odczytać wartość właściwości.

Dotyczy

Zobacz też