In this tutorial, you will learn how to create a dropdown list and a checkbox list within Episerver CMS. The interesting twist in this tutorial is that we will get the data for these properties from the options defined within a bunch of custom enums. A very frequent requirement on projects is to give content editors the ability to pick from a list of things. Usability wise the best component to allow a user to pick an option from a range of items is usually either a drop-down or check-box list. Within Episerver CMS you can give this ability to a content editor via a selection factory property.

Understanding how this property works will give you a lot more content modelling power. Want to learn more, read on 🔥🔥🔥

What is a Selection Factory?

A selection factory is a dynamic CMS component that allows you as a developer to populate a selectable list within the editor with some type of data. To create a list you decorate a property with SelectOne. To create a checkbox, you decorate a property with the SelectMany attribute.

Both SelectOne and SelectMany require a data source specified when used. This is done via constructor property called SelectionFactoryType. SelectionFactoryType will provide the property with the data required to populate the items in either dropdown or checkbox. This data source will require you to create a custom class. This class is known as the selection factory. To add a data source to a property you will add the property with the SelectionFactoryType when adding the attribute. To create a selection factory, you will need to create a class implemented from the ISelectionFactory interface. As seen below:

To associate the selection factory onto a page or block property, you create a property and decorate it with a SelectOne or SelectMany. Add the CurrentSelectionFactory property, job done 💥

When you create a class that implement ISelectionFactory you will need to implement the GetSelections() method:

It is within this method, where add the code to fetch whatever data you need.

A Page Type Selection Factory

Now we've gone over a simple example with hardcoded values, let us go over the code to dynamically get data. Imagine we want to return a list of metadata stored in a page type called category. All category pages have been created within the CMS under the root node, under a page called Category Settings which is of type Category Root. To query for this data in code, we call the root page. In the Get() called we search the roto pages children to find the Category Root page. After finding it, we can use the Children property to get the meta-data for our list.

TIP: If you are unsure about the best way to store meta-data and settings in Episerver CMS, I would recommend reading The Best Ways To Store Site Settings in Episerver 💥

In the GetSelections() method we call GetCategories(). Here, we first get a reference to the root page. The code iterates through the list to find the category root. Performance-wise as this is a one-off call made infrequently by content editors, I would not normally worry about optimizing the code with caching. In a high traffic project, you could optimize this if you notice performance problems. After getting the data, items are added to a list of ISelectItem and returned. We're done. 🔥🔥🔥

This is all the code required to create dynamic drop-down and checkbox properties within the CMS. Simples. Happy Coding 🤘