SaaS CMS has officially launched! Learn more now.

Alexander Haneng
Jan 23, 2013
  4594
(1 votes)

Getting EPiServer 6 custom properties to work in EPiServer 7: Cannot create and populate list type…

When working on getting EPiImage to work in EPiServer 7 I ran into the following error when publishing or auto saving an EPiImageGalleryProperty.

 

clip_image002

 

From the error message I guessed it had something to do with the JSON communication used in the new UI.

 

Turns out that since EPiImageGalleryProperty stores its data as an EPiImageGalleryImageCollection object, EPiServer 7 doesn’t know how to serialize it as a JSON object. But how can we tell EPiServer explicitly how to do the serialization?

 

Luckily Linus Ekström (EPiServer Sweden) helped me out with some sample code:

using System;
using EPiServer.ServiceLocation;
using Newtonsoft.Json;
 
namespace EPiServer.Cms.Shell.Json
{
    /// <summary>
    /// Json converter thas handles conversion between 
    /// <see cref="Url"/> and <see cref="string"/>.
    /// </summary>
    [ServiceConfiguration(typeof(JsonConverter))]
    public class UrlConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(Url).IsAssignableFrom(objectType);
        }
 
        public override object ReadJson(
            JsonReader reader, 
            Type objectType, 
            object existingValue, 
            JsonSerializer serializer)
        {
            return (reader.Value == null) ? null : 
                new Url(reader.Value.ToString());
        }
 
        public override void WriteJson(
            JsonWriter writer, 
            object value, 
            JsonSerializer serializer)
        {
            var url = value as Url;
            if (url == null || url.IsEmpty())
            {
                writer.WriteValue(string.Empty);
                return;
            }
            writer.WriteValue(value.ToString());
        }
    }
}

 

This class which inherits from JsonConverter tells EPiServer 7 how to do the conversion of a EPiServer.Url to Json (meaning a string representation) and back again.

 

I can create my own Json converter for EPiImageGalleryImageCollection like this:

using System;
using EPiServer.ServiceLocation;
using Newtonsoft.Json;
 
namespace MakingWaves.EPiImage.EPiImage.Code
{
    /// <summary>
    /// Json converter that handles conversion between 
    /// EPiImageGalleryImageCollectionConverter 
    /// and string for the new EPiServer 7 UI
    /// </summary>
    [ServiceConfiguration(typeof(JsonConverter))]
    public class EPiImageGalleryImageCollectionJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(EPiImageGalleryImageCollection).IsAssignableFrom(objectType);
        }
 
        public override object ReadJson(
            JsonReader reader, 
            Type objectType, 
            object existingValue, 
            JsonSerializer serializer)
        {
            if (reader.Value == null)
                return null;
 
            return new EPiImageGalleryImageCollection(reader.Value.ToString());
        }
 
        public override void WriteJson(
            JsonWriter writer, 
            object value, 
            JsonSerializer serializer)
        {
            EPiImageGalleryImageCollection gallery = value 
                as EPiImageGalleryImageCollection;
            if (gallery == null || gallery.Count == 0)
            {
                writer.WriteValue(string.Empty);
                return;
            }
            writer.WriteValue(gallery.ToString());
        }
 
    }
}

 

For it to work I also needed to do the following changes to my existing EPiImage code:

1. Create a ToString method for EPiImageGalleryImageCollection that accurately serialized the data in the object to a string. As it consists of a List<EPiImageGalleryImage> I also need to:

2. Create a ToString method for EPiImageGalleryImage that accurately serialized the data in the object to a string

3. Create a constructor method for EPiImageGalleryImageCollection that could take in the serialized string as a parameter to recreate the object

4. Create a constructor method for EPiImageGalleryImage that could take in the serialized string as a parameter to recreate the object

 

If you are converting your own custom property to work with EPiServer 7, I thought this code might guide you in the right direction Smile

Jan 23, 2013

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely Developer - London Meetup 2024

Hello and welcome to another instalment of A Day In The Life Of An Optimizely Developer. Last night (11th July 2024) I was excited to have attended...

Graham Carr | Jul 16, 2024

Creating Custom Actors for Optimizely Forms

Optimizely Forms is a powerful tool for creating web forms for various purposes such as registrations, job applications, surveys, etc. By default,...

Nahid | Jul 16, 2024

Optimizely SaaS CMS Concepts and Terminologies

Whether you're a new user of Optimizely CMS or a veteran who have been through the evolution of it, the SaaS CMS is bringing some new concepts and...

Patrick Lam | Jul 15, 2024

How to have a link plugin with extra link id attribute in TinyMce

Introduce Optimizely CMS Editing is using TinyMce for editing rich-text content. We need to use this control a lot in CMS site for kind of WYSWYG...

Binh Nguyen Thi | Jul 13, 2024