Minesh Shah (Netcel)
Feb 15, 2022
  532
(6 votes)

Property Lists Serialization and Content Delivery API

When utilising property lists in CMS v12 we found the content was not automatically being serialised and returned in the JSON Payload of the Content Delivery API v3.0

To overcome this, we implemented the IPropertyConverter interface found in the EPiServer.ContentApi.Core.Serialization namespace and registered using dependency injection.

Please be aware the Interface’s documentation does state it is currently in Preview State and could introduce breaking changes between minor versions.

To demonstrate the serialization of a property list I have used a simple example of a property list containing of a model containing two string properties.

Example Code:

Create a Property Model Inheriting EPiServer.ContentApi.Core.Serialization.Models.PropertyModel

    public class BenefitItemPropertyModel : PropertyModel<IEnumerable<BenefitItemModel>, PropertyList<BenefitItemModel>>
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="BenefitItemPropertyModel"/> class.
        /// </summary>
        /// <param name="type"></param>
        public BenefitItemPropertyModel(PropertyList<BenefitItemModel> type)
            : base(type)
        {
            Value = GetValues(type.List);
        }

        private IEnumerable<BenefitItemModel> GetValues(IList<BenefitItemModel> items)
        {
            return items.Select(x => new BenefitItemModel
            {
                BenefitText = x.BenefitText,
                BenefitIcon = x.BenefitIcon
            });
        }
    }

Implement the IPropertyConverter Interface and the Convert Method

    public class BenefitItemListPropertyConvertor : IPropertyConverter
    {
        /// <inheritdoc />
        public IPropertyModel Convert(PropertyData propertyData, ConverterContext contentMappingContext)
        {
            return new BenefitItemPropertyModel((PropertyList<BenefitItemModel>)propertyData);
        }
    }

Register the dependency in the Startup.cs Class

services.TryAddScoped<BenefitItemListPropertyConvertor>();

Having implemented the above you should get the following response from the content delivery API

                "displayOption": "col-6",
                "contentLink": {
                    "id": 146,
                    "workId": 0,
                    "guidValue": "83db556b-a029-4108-8b38-0cf4a29c9d9a",
                    "expanded": {
                        "contentLink": {
                            "id": 146,
                            "workId": 0,
                            "guidValue": "83db556b-a029-4108-8b38-0cf4a29c9d9a"
                        },
                        "name": " Benefits",
                        "contentType": [
                            "Block",
                            "BenefitsBlock"
                        ],
                        "theme": "green",
                        "benefits": [
                            {
                                "benefitIcon": "icon_pound",
                                "benefitText": "Lorem ipsum dolor sit amet"
                            },
                            {
                                "benefitIcon": "icon_pound",
                                "benefitText": "Lorem ipsum dolor sit amet"
                            }
                        ]
                    }
                }
            },
Feb 15, 2022

Comments

Please login to comment.
Latest blogs
Content Delivery API – The Case of the Duplicate API Refresh Token

Creating a custom refresh provider to resolve the issues with duplicate tokens in the DXC The post Content Delivery API – The Case of the Duplicate...

David Lewis | Sep 29, 2022 | Syndicated blog

New Optimizely certifications - register for beta testing before November 1st

In January 2023, Optimizely is making updates to the current versions of our certification exams to make sure that each exam covers the necessary...

Jamilia Buzurukova | Sep 28, 2022

Optimizely community meetup - Sept 29 (virtual + Melbourne)

Super excited to be presenting this Thursday the 29th of September at the Optimizely community meetup. For the full details and RSVP's see the...

Ynze | Sep 27, 2022 | Syndicated blog

Preview multiple Visitor Groups directly while browsing your Optimizely site

Visitor groups are great - it's an easy way to add personalization towards market segments to your site. But it does come with it's own set of...

Allan Thraen | Sep 26, 2022 | Syndicated blog

The Report Center is finally back in Optimizely CMS 12

With Episerver.CMS.UI 12.12.0 the Report Center is finally re-introduced in the core product.

Tomas Hensrud Gulla | Sep 26, 2022 | Syndicated blog

Dynamic Route in ASP.NET Core When MapDynamicControllerRoute Does Not Work

Background Creating one of the add-on for Optimizely I had to deal with challenge to register dynamically route for the API controller. Dynamic rou...

valdis | Sep 25, 2022 | Syndicated blog