sunylcumar
May 12, 2025
visibility 1974
star star star star star
(3 votes)

Creating a Dropdownlist in Optimizely CMS: Populate ISelectionFactory with values from another block's properties

Create a Block to hold selection options

using EPiServer.Cms.Shell.UI.ObjectEditing.EditorDescriptors;
using EPiServer.PlugIn;
using EPiServer.Shell.ObjectEditing;
using System.ComponentModel.DataAnnotations;
namespace MyApp.Models.Blocks
{
    [ContentType(DisplayName = "Select Options Block", Description = "")]
    public class SelectOptionsBlock : BlockData
    {
        [CultureSpecific]     
        [Display(Name = "Selection Options", Description = "List of options for the selection list.",  GroupName = SystemTabNames.Content, Order = 100)]
        [EditorDescriptor(EditorDescriptorType = typeof(CollectionEditorDescriptor<SelectionOption>))]
        public virtual IList<SelectionOption> SelectionOptions { get; set; }
    }

    public class SelectionOption
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }

    [PropertyDefinitionTypePlugIn]
    public class SelectionOptionProperty : PropertyList<SelectionOption> { }

}

Create a page where you want to have the selection list and add the following 2 properties

namespace MyApp.Models.Pages
{
    [ContentType(DisplayName = "SelectionList Page", Description = "Page with a selection list populated from a block.", GroupName = SiteGroupNames.Specialized)]
    public class SelectionListPage : PageData
    {
        [CultureSpecific]
        [Display(Name = "Select Options Block", Description = "", GroupName = SystemTabNames.Content, Order = 1)]
        [AllowedTypes(typeof(SelectOptionsBlock))]
        public virtual ContentReference SelectOptionsBlockContent { get; set; }

        [CultureSpecific]
        [Display(Name = "Select List", Description = "",  GroupName = SystemTabNames.Content,  Order = 1)]
        [SelectOne(SelectionFactoryType = typeof(ItemSelectionFactory))]
        public virtual string SelectList { get; set; }
    }
}

Now create a selection list factory

using EPiServer.ServiceLocation;
using EPiServer.Shell.ObjectEditing;
using SVP.Models.Blocks;
namespace MyApp.Business.SelectionFactories
{
    public class ItemSelectionFactory : ISelectionFactory
    {
        public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
        {
            var loader = ServiceLocator.Current.GetInstance<IContentLoader>();
            var list = new List<SelectItem>();  
            dynamic contentMetadata = metadata;
            var ownerContent = contentMetadata.OwnerContent as IContent;            
            //create a dynamic object of current content type
            dynamic parentItem = ownerContent;
            //check if the block containing the select options is added to the current content (page or block)
            if (parentItem.SelectOptionsBlockContent != null)
            {
                //Get the block containing select options
                var optionsBlock = loader.Get<SelectOptionsBlock> parentItem.SelectOptionsBlockContent);
                //check if the optionsBlock has any items
                if (optionsBlock.SelectionOptions != null && optionsBlock.SelectionOptions.Count > 0)
                {
                    foreach (var listItem in optionsBlock.SelectionOptions)
                    {
                        list.Add(new SelectItem() { Text = listItem.Text, Value = listItem.Value });
                    }
                }
            }
            return list;
        }
    }
}

From the CMS, create a new block of type SelectOptionsBlock and add the necessary select options and publish it.

Select this newly created block in your page that you have created to have the selection list and publish the page.

May 12, 2025

Comments

El Magnifico
El Magnifico May 18, 2025 02:15 PM

Exellent example with full working source code.

error Please login to comment.
Latest blogs
Surviving a Dirty Feed. Part 3: Error Handling and Event Batching

Committing a 250,000-row Optimizely catalog import row by row, returning a per-row failure report, and coalescing catalog events into one per batch.

Stanisław Szołkowski | Oct 16, 2026 |

Building UI Extensions for Optimizely SaaS CMS

Introduction Developers have been extending the functionality of Optimizely PaaS CMS for years using addons built in C# and deployed as NuGet...

Mark Stott | Oct 15, 2026

Cheapskate AI Translator: Because Translation Should Not Require a Second Mortgage

There is a particular kind of software project that begins with a detailed architecture document, a product roadmap, and a carefully assembled...

Linh Doan Cuu | Oct 15, 2026

Computed Fields in CMS 13 Content Contracts with Optimizely Graph

Content Contracts in Optimizely CMS 13 allow different content types to share a common structure when querying Optimizely Graph. But what if the...

Mardy | Oct 14, 2026