Take the community feedback survey now.

Magnus Rahl
Nov 10, 2010
  3571
(0 votes)

Fix for DOPE of LongString properties in CMS 6

As noted by Per Nergård in this blog post the LongString property has a bug in CMS 6 which prevents pages from saving changes when edited in Direct On-Page Editing (DOPE) mode.

Work around

This is a bug confirmed by EPiServer which will be fixed in an upcoming release. But we needed to fix it quick. By creating a subclass for the PropertyLongStringControl it’s possible to work around the bug. Then the PropertyControlClassFactory can be used to tell EPiServer to use this derived control instead of the original control for all LongString properties. You can either do this in web.config or in code. I chose the latter alternative, inspired by Ted Nyberg’s blog post.

Custom property control

This is the code for the custom property control:

namespace Acme.Web.SpecializedProperties
{
    /// <summary>
    /// Subclass for PropertyLongStringControl which has a work around
    /// for the DOPE bug in CMS 6 R1
    /// </summary>
    public class FixedPropertyLongStringControl : PropertyLongStringControl
    {
        private OnPageEditInputControl _onPageEditInputControl;
        public override void CreateOnPageEditControls()
        {
            if (base.PropertyData is PropertyXhtmlString)
            {
                // Use standard implementation for XHTML properties
                base.CreateOnPageEditControls();
            }
            else
            {
                // Long string, work around bug: use local edit control
                CreateStandardOnPageEditControls();
            }
        }
        /// <summary>
        /// Creates the input control used in DOPE mode for
        /// LongString Properties. This code is reflected from
        /// the standard PropertyDataControl, with the difference
        /// that IsHtmlContent is always set to false
        /// </summary>
        protected virtual void CreateStandardOnPageEditControls()
        {
            _onPageEditInputControl = new OnPageEditInputControl();
            CopyWebAttributes(_onPageEditInputControl);
            _onPageEditInputControl.ID = Name;
            _onPageEditInputControl.Text = ToWebString();
            // This code only runs for non-Xhtml properties - disable html
            _onPageEditInputControl.IsHtmlContent = false;
            Controls.Add(_onPageEditInputControl);
        }
        public override void ApplyOnPageEditChanges()
        {
            if (_onPageEditInputControl == null)
            {
                // The local edit control wasn't created,
                // which means we use the standard implementation
                base.ApplyOnPageEditChanges();
            }
            else
            {
                // Work around bug, use local edit control
                base.SetValue(this._onPageEditInputControl.Text);
            }
        }
    }
}

Override standard control

This is the code for a PluginAttribute subclass which is used to hook into the init process and register the new control:

namespace Acme.Web.PropertyControlSetup
{
    /// <summary>
    /// Maps EPiServer property types to our own property control types,
    /// uses PluginAttribute to bootstrap the init process
    /// </summary>
    public class PropertyControlSetup : EPiServer.PlugIn.PlugInAttribute
    {
        public static void Start()
        {
            PropertyControlClassFactory.Instance.RegisterClass(typeof(PropertyLongString), typeof(SpecializedProperties.FixedPropertyLongStringControl));
        }
    }
}

A final note

The code-based approach to use PropertyControlClassFactory won’t work in this case if you are using the legacy editor in CMS 6. The reason for this is that the web.config approach is used to replace the new editor with the old, which seems to take precedence over this code change so it is ignored.

Nov 10, 2010

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely OMVP - Opticon London 2025

This installment of a day in the life of an Optimizely OMVP gives an in-depth coverage of my trip down to London to attend Opticon London 2025 held...

Graham Carr | Oct 2, 2025

Optimizely Web Experimentation Using Real-Time Segments: A Step-by-Step Guide

  Introduction Personalization has become de facto standard for any digital channel to improve the user's engagement KPI’s.  Personalization uses...

Ratish | Oct 1, 2025 |

Trigger DXP Warmup Locally to Catch Bugs & Performance Issues Early

Here’s our documentation on warmup in DXP : 🔗 https://docs.developers.optimizely.com/digital-experience-platform/docs/warming-up-sites What I didn...

dada | Sep 29, 2025

Creating Opal Tools for Stott Robots Handler

This summer, the Netcel Development team and I took part in Optimizely’s Opal Hackathon. The challenge from Optimizely was to extend Opal’s abiliti...

Mark Stott | Sep 28, 2025

Integrating Commerce Search v3 (Vertex AI) with Optimizely Configured Commerce

Introduction This blog provides a technical guide for integrating Commerce Search v3, which leverages Google Cloud's Vertex AI Search, into an...

Vaibhav | Sep 27, 2025

A day in the life of an Optimizely MVP - Opti Graph Extensions add-on v1.0.0 released

I am pleased to announce that the official v1.0.0 of the Opti Graph Extensions add-on has now been released and is generally available. Refer to my...

Graham Carr | Sep 25, 2025