WebPartManager.IPersonalizable.IsDirty 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得值,指出網頁上 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 控件的程序代碼,以及介面。
裝載所有控件的網頁。
說明程式代碼範例的運作方式。
程式代碼範例的第一個部分是變更顯示模式的使用者控件。 您可以從類別概觀的 Example 區段取得使用者控制件的 WebPartManager 原始碼。 如需顯示模式和使用者控件運作方式的詳細資訊,請參閱逐步解 說:變更網頁元件頁面上的顯示模式。
範例的第二個部分是原始程序檔,其中包含自定義控件和介面。 請注意, IZipCode
介面會公開一個方法,而且在自定義 ZipCodeWebPart
控件中實作的這個方法可作為回呼方法,以在 ZipCodeWebPart
連線案例中作為提供者。 另一個控件 WeatherWebPart
會作為連接中的取用者控制項;它可以取用 所提供的 ZipCodeWebPart
特定介面。 在實際的應用程式中, WeatherWebPart
可能會取用提供者的個人化郵遞區編碼值,然後將圖形化天氣資訊提供給使用者。
若要執行程式碼範例,您必須編譯此原始程式碼。 您可以明確地編譯它,並將產生的元件放在網站的 Bin 資料夾或全域程式集緩存中。 或者,您可以將原始程式碼放在月臺的 App_Code資料夾中,其將在運行時間動態編譯。 此程式代碼範例會使用動態編譯;因此,請注意 Register
,網頁頂端這個元件的 指示詞只 TagPrefix
包含 和 Namespace
屬性,而不 Assembly
包含 屬性。 如需示範如何編譯的逐步解說,請參閱逐步解說 :開發和使用自定義 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
程式代碼範例的第三個部分是網頁。 請注意,它包含兩 WebPartZone 個區域,其中第一個區域包含兩個自定義 WebPart 控件。 另外還有一個 CatalogZone 區域,其中包含使用者可以新增至頁面的標準 Calendar 控件。 元素 <asp:connectionszone>
會提供連線 UI,讓使用者建立控制件之間的連線。 請注意,在方法中 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
文字,表示個人化數據已變更。 例如,您可以:
按兩下 [ 連接 Web 元件控制件 ] 按鈕,以建立控制件之間的連線。
使用 [ 顯示模式 ] 下拉式清單控件將頁面切換為目錄模式,並將 [我的行事曆 ] 控件新增至第二 WebPartZone 個區域。
將頁面變更回流覽模式,按下動詞功能表, (在 [ 我的行事曆 ] 控件的標題欄中) 箭號顯示,然後選取 [ 關閉 ] 將其關閉,並將其新增至頁面目錄。
將頁面傳回目錄模式,並將 [我的行事曆] 控件新增回頁面。
使用 [顯示模式 ] 控件將頁面切換為設計模式,並將一或多個控件拖曳至另一個區域或相同區域中的不同位置,以重新排列控件的配置。
備註
IPersonalizable.IsDirty屬性提供一種方式,讓呼叫端判斷控制項所WebPartManager管理的個人化狀態數據是否已變更。 當使用者個人化頁面層級的詳細數據時,例如變更頁面配置、建立或刪除連線,以及新增或刪除控件,控件所管理的個人化數據會 WebPartManager 變更。 這是傳遞方法,會傳回給呼叫端受保護 IsCustomPersonalizationStateDirty 屬性的值,呼叫端無法直接存取這個方法。
注意
屬性 IPersonalizable.IsDirty 不會指出可個人化屬性值或影響個別控件外觀的個別 WebPart 屬性已變更。 個別追蹤每個控制層級個人化。 屬性 IPersonalizable.IsDirty 只會指出位於頁面層級且由 WebPartManager 控件管理的個人化數據是否已變更。
下列清單描述會導致 屬性傳回 值的true
一些常見個人化IPersonalizable.IsDirty實例,指出WebPartManager控件有一些變更的個人化數據:
關閉頁面上的靜態 WebPart 控件 (或伺服器或使用者控件) 。
將關閉的靜態 WebPart 控件從頁面目錄還原回頁面。
將其區域內的任何控件或移至另一個區域。
從或 伺服器控制件的 WebPart 目錄新增 控制項,或以程式設計方式新增控件。
以程式設計方式建立兩 WebPart 個控件之間的連線,或使用連接使用者介面 (UI) 。
以程式設計方式或使用連線 UI 刪除兩 WebPart 個控件之間的連線。
若要存取這個屬性值,您必須將 WebPartManager 控件實例 IPersonalizable 轉換成 介面;然後,您可以讀取 IsDirty 屬性值。