Area: Optimizely CMS
Applies to versions: 9.0 and higher

Generic PropertyList (PropertyList<T>)

Recommended reading 

Note: This topic describes unsupported functionality in Optimizely CMS. Optimizely recommends using ContentArea and Blocks for lists of complex objects. Using PropertyList<T> together with complex types requires additional custom functionality to fully ensure data consistency, portability and functionality. This includes, but is not limited to UI, Settings, Export/Import, Permanent link handling and default values.

PropertyList is a property that allows you to define an editable list of objects. Content model can implement a property of type IList<T> where T is a class with property definitions.

public virtual IList<CustomItem> List{ get; set; }

Example - list of locations

This example shows how to implement a list of locations.

Generic PropertyList.png

PropertyList allows the editor to edit items using a dialog window.

Editing Generic PropertyList.png

The list contains items with string properties:

  • address list 1
  • address line 2
  • city
  • country.

First we have to define Location model class. It will represent the property item.

using System.ComponentModel.DataAnnotations;

namespace Site.Models.Pages
    public class Location
        [Display(Name = "Address line 1")]
        public virtual string AddressLine1 { get; set; }

        [Display(Name = "Address line 2")]
        public virtual string AddressLine2 { get; set; }

        public virtual string City { get; set; }

        public virtual string Country { get; set; }

The next step is to register the property definition. It is done using a custom property class LocationsProperty that sets the generic type to Location item class:

using EPiServer.PlugIn;

namespace Site.Models.Pages
    public class LocationsProperty : PropertyList<Location> { }

Finally we can add list of locations on the page:

using System.ComponentModel.DataAnnotations;
using EPiServer.Core;
using EPiServer.DataAnnotations;
using EPiServer.Cms.Shell.UI.ObjectEditing.EditorDescriptors;
using EPiServer.Shell.ObjectEditing;
using System.Collections.Generic;

namespace Site.Models.Pages
    /// <summary>
    /// Page with PropertyListDefinition
    /// </summary>
    [ContentType(GUID = "2CDDC73C-83AC-4F35-BA9D-50F285723A96")]
    public class TestPage : PageData
        [Display(Name = "List of locations")]
        [EditorDescriptor(EditorDescriptorType = typeof(CollectionEditorDescriptor<Location>))]
        public virtual IList<Location> Locations { get; set; }

Localizing item properties

List item properties can be translated in a similar way as Content properties translation. Properties can be translated using DisplayAttribute and language files. More information about localized texts can be found here.

Do you find this information helpful? Please log in to provide feedback.

Last updated: Feb 04, 2019

Recommended reading