Export (0) Print
Expand All

IPersonalizable.Save Method

Saves custom properties and internal state information in the control's PersonalizationDictionary object.

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

void Save(
	PersonalizationDictionary state


Type: System.Web.UI.WebControls.WebParts.PersonalizationDictionary
A PersonalizationDictionary that contains custom scoped data that was loaded from the underlying data store.

A server control can store its own custom properties and internal state information the PersonalizationDictionary specified in the state parameter. The information is stored as a series of name/value pairs. It is the responsibility of the control to use name/value pairs that it can recognize during subsequent calls made to the control through the Load method.

A control can reference its associated WebPartManager control and check the PersonalizationScope object to determine the current scope. Custom state information should be appropriate for the current scope. Note that each PersonalizationEntry value that is added to the PersonalizationDictionary object should be associated with the appropriate scope value, because the personalization infrastructure depends on this when merging Shared and User-scoped custom data prior to passing it to the Load method.

When using the standard ASP.NET implementation of Web Parts, controls must ensure that objects placed in the state dictionary can be serialized by the ASP.NET ObjectStateFormatter class. In practice, this means the following:

  • Primitive .NET Framework types, strings, and collection-oriented .NET Framework types such as arrays, array lists, hash tables, and hybrid dictionaries, are automatically serializable.

  • Custom types that supply their own TypeConverter classes capable of serializing to and deserializing from strings are considered serializable.

  • Custom types that can be serialized by the BinaryFormatter class are considered serializable.

Important noteImportant

You should not add types based on classes defined in the App_Code directory and then depend on the default binary serialization mechanism. App_Code-based artifacts are not consistently binary-serializable due to the fact that they can have their assembly names changed at random points in time.

The following code example demonstrates implementing the Save method in a custom WebPart control. For the full code required to run this example, see the Example section in the IPersonalizable class overview.

namespace Samples.AspNet.CS.Controls

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Drawing;
    using System.Web;
    using System.Web.UI;
    using System.Security.Permissions;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;

      Level = AspNetHostingPermissionLevel.Minimal)]
      Level = AspNetHostingPermissionLevel.Minimal)]
    public class UrlListWebPart : WebPart, IPersonalizable
        private ArrayList _sharedUrls;
        private ArrayList _userUrls;
        private bool _listDirty;

        private TextBox _nameTextBox;
        private TextBox _urlTextBox;
        private Button _addButton;
        private BulletedList _list;

        protected override void CreateChildControls()
            Label nameLabel = new Label();
            Label urlLabel = new Label();
            LiteralControl breakLiteral1 = new LiteralControl("<br />");
            LiteralControl breakLiteral2 = new LiteralControl("<br />");
            LiteralControl breakLiteral3 = 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";
            _addButton.Click += new EventHandler(this.OnClickAddButton);
            _list.DisplayMode = BulletedListDisplayMode.HyperLink;
            _list.ID = "list";





        private void OnClickAddButton(object sender, EventArgs e)
            string name = _nameTextBox.Text.Trim();
            string url = _urlTextBox.Text.Trim();

            Pair p = new Pair(name, url);
            if (WebPartManager.Personalization.Scope == PersonalizationScope.Shared)
                if (_sharedUrls == null)
                    _sharedUrls = new ArrayList();
                if (_userUrls == null)
                    _userUrls = new ArrayList();


        protected virtual void OnUrlAdded()
            _listDirty = true;
            ChildControlsCreated = false;

        protected override void RenderContents(HtmlTextWriter writer)
            if (_sharedUrls != null)
                foreach (Pair p in _sharedUrls)
                    _list.Items.Add(new ListItem((string)p.First, (string)p.Second));
            if (_userUrls != null)
                foreach (Pair p in _userUrls)
                    _list.Items.Add(new ListItem((string)p.First, (string)p.Second));


        public virtual bool IsDirty
                return _listDirty;
        public new virtual void Load(PersonalizationDictionary state)
            if (state != null)
                PersonalizationEntry sharedUrlsEntry = state["sharedUrls"];
                if (sharedUrlsEntry != null)
                    _sharedUrls = (ArrayList)sharedUrlsEntry.Value;

                PersonalizationEntry userUrlsEntry = state["userUrls"];
                if (userUrlsEntry != null)
                    _userUrls = (ArrayList)userUrlsEntry.Value;

        public virtual void Save(PersonalizationDictionary state)
            if ((_sharedUrls != null) && (_sharedUrls.Count != 0))
                state["sharedUrls"] = new PersonalizationEntry(_sharedUrls, PersonalizationScope.Shared);
            if ((_userUrls != null) && (_userUrls.Count != 0))
                state["userUrls"] = new PersonalizationEntry(_userUrls, PersonalizationScope.User);

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Community Additions

© 2015 Microsoft