IPersonalizable.IsDirty Property


Gets a value that indicates whether the custom data that a control manages has changed.

Namespace:   System.Web.UI.WebControls.WebParts
Assembly:  System.Web (in System.Web.dll)

ReadOnly Property IsDirty As Boolean

Property Value

Type: System.Boolean

true if the custom data managed with the IPersonalizable interface has changed; otherwise, false.

When data managed by a control has changed, the control is considered "dirty." A control should return true if the custom data that it manages through the IPersonalizable interface has changed. If a control returns true from this property, the control's Save interface method implementation is called during property value extraction.


This property is checked automatically by the personalization infrastructure during the latter phases of processing a POST request. However, for GET requests, the value returned from the IsDirty property is not checked. Some other event has to have caused the control to be considered "dirty" for any control state--not just data managed by IPersonalizable--to be saved. If a control can mark itself as "dirty" during a GET request, or if the personalization infrastructure under some very specific boundary conditions considers a control "dirty" during a GET request, then Save will always be called.

A control can reference its associated WebPartManager control and check the Scope property to determine the current scope. The "dirty" state of a control's custom data should be appropriate for the current scope.

The following code example demonstrates use of the IsDirty property. The first part of the example is the Web page that hosts a WebPart control.

<%@ Page Language="VB"  %>
<%@ Register TagPrefix="dict" 
    namespace="Samples.AspNet.VB.Controls" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <form id="form1" runat="server">
    <asp:WebPartManager ID="mgr" runat="server" />
    <asp:WebPartZone ID="WebPartZone1" runat="server">
        <dict:urllistwebpart id="listwp1" runat="server"
          title="URL List WebPart" />

The second part of the example is the code for the custom WebPart control called UrlListWebPart. This file should be placed in the App_Code directory to run the example. Note that the source code implements the IsDirty property.

Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Drawing
Imports System.Web
Imports System.Web.UI
Imports System.Security.Permissions
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 Class UrlListWebPart
      Inherits WebPart
      Implements IPersonalizable
      Private _sharedUrls As ArrayList
      Private _userUrls As ArrayList
      Private _listDirty As Boolean

      Private _nameTextBox As TextBox
      Private _urlTextBox As TextBox
      Private _addButton As Button
      Private _list As BulletedList

      Protected Overrides Sub CreateChildControls()
          Dim nameLabel As New Label()
          Dim urlLabel As New Label()
          Dim breakLiteral1 As New LiteralControl("<br />")
          Dim breakLiteral2 As New LiteralControl("<br />")
          Dim breakLiteral3 As New LiteralControl("<br />")

          _nameTextBox = New TextBox()
          _urlTextBox = New TextBox()
          _addButton = New Button()
          _list = New BulletedList()

          nameLabel.Text = "Name: "
          urlLabel.Text = "URL: "
          _nameTextBox.ID = "nameTextBox"
          _urlTextBox.ID = "urlTextBox"
          _addButton.Text = "Add"
          _addButton.ID = "addButton"
          AddHandler _addButton.Click, AddressOf Me.OnClickAddButton
          _list.DisplayMode = BulletedListDisplayMode.HyperLink
          _list.ID = "list"





      End Sub 'CreateChildControls

      Private Sub OnClickAddButton(ByVal sender As Object, ByVal e As EventArgs)
          Dim name As String = _nameTextBox.Text.Trim()
          Dim url As String = _urlTextBox.Text.Trim()

          Dim p As New Pair(name, url)
          If WebPartManager.Personalization.Scope = PersonalizationScope.Shared Then
              If _sharedUrls Is Nothing Then
                  _sharedUrls = New ArrayList()
              End If
              If _userUrls Is Nothing Then
                  _userUrls = New ArrayList()
              End If
          End If


      End Sub 'OnClickAddButton

      Protected Overridable Sub OnUrlAdded()
          _listDirty = True
          ChildControlsCreated = False

      End Sub 'OnUrlAdded

      Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
          If Not (_sharedUrls Is Nothing) Then
              Dim p As Pair
              For Each p In _sharedUrls
                  _list.Items.Add(New ListItem(CStr(p.First), CStr(p.Second)))
              Next p
          End If
          If Not (_userUrls Is Nothing) Then
              Dim p As Pair
              For Each p In _userUrls
                  _list.Items.Add(New ListItem(CStr(p.First), CStr(p.Second)))
              Next p
          End If


      End Sub 'RenderContents

      Public Overridable ReadOnly Property IsDirty() As Boolean _
        Implements IPersonalizable.IsDirty
              Return _listDirty
          End Get
      End Property

      Public Overridable Shadows Sub Load(ByVal state As PersonalizationDictionary) _
        Implements IPersonalizable.Load
          If Not (state Is Nothing) Then
              Dim sharedUrlsEntry As PersonalizationEntry = state("sharedUrls")
              If Not (sharedUrlsEntry Is Nothing) Then
                  _sharedUrls = CType(sharedUrlsEntry.Value, ArrayList)
              End If

              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 IPersonalizable.Save
          If Not (_sharedUrls Is Nothing) AndAlso _sharedUrls.Count <> 0 Then
              state("sharedUrls") = New PersonalizationEntry(_sharedUrls, PersonalizationScope.Shared)
          End If
          If Not (_userUrls Is Nothing) AndAlso _userUrls.Count <> 0 Then
              state("userUrls") = New PersonalizationEntry(_userUrls, PersonalizationScope.User)
          End If

      End Sub
  End Class

End Namespace

Load the page in a browser. Type in a name to represent a URL, then add an actual URL beginning with http://, and click the Add button to add the URL.

.NET Framework
Available since 2.0
Return to top