Bartosz Sekula
Sep 14, 2022
visibility 7041
star star star star star
(4 votes)

Built-in support for single LinkItem property

EPiServer.CMS 12.11.0 introduces a new property type LinkItem . This feature has been one of the most requested features for a long time.

The feature is very simple: it is to allow the editor to choose a single LinkItem. 

After clicking the `Add Link` button editor is presented with the standard Linkitem dialog:

After selecting any content item the editor will look like this:

In order to use the new property type you just need to use the LinkItem data type. No annotations are needed.

public class PartnerPage : PageData
{
    public virtual LinkItem MyLink { get; set; }
}

Migration from EPiServer.Labs.LinkItemProperty

If you used the Labs package before and you wish to update then you will need to follow a few manual upgrade steps:

Labs used the following:

public class PartnerPage : PageData
{
    [LinkItemProperty]
    [BackingType(typeof(PropertyLinkCollection))]
    public virtual LinkItem Link
    {
        get => this.GetLinkItemPropertyValue(nameof(Link));
        set => this.SetLinkItemPropertyValue(nameof(Link), value);
    }
}

You have to remove both LinkItemProperty and BackingType annotations and switch to auto property.

public class PartnerPage : PageData
{
    public virtual LinkItem Link { get; set; }
}

You will also need to run the following SQL command (don't forget to do the backup for safety)

DECLARE @PropertiesToUpdate NVARCHAR(4000); -- one or more coma separated properties to update with [ContentTypeName.PropertyName] format
SET @PropertiesToUpdate = ''; -- for example ArticlePage2.SingleLink,ArticlePage2.SingleLinkCultureSpecific

-- update published versions
UPDATE tblContentProperty
 SET tblContentProperty.LongString = SUBSTRING(  -- start after `<links>`
           SUBSTRING(propValue.LongString, 0, CHARINDEX('</a>',  propValue.LongString) + 4), -- remove all text after first `</a>`
           8, 100000)
 OUTPUT INSERTED.*, deleted.*
  FROM tblPropertyDefinition propDef
  JOIN tblPropertyDefinitionType propDefType ON propDefType.[Name] = 'LinkCollection'
   AND propDef.fkPropertyDefinitionTypeID = propDefType.pkID
  JOIN tblContentType ON tblContentType.pkID = propDef.fkContentTypeID
  JOIN tblContentProperty propValue ON propValue.fkPropertyDefinitionID = propDef.pkID
 WHERE propValue.LongString LIKE '<links>%'
   AND CHARINDEX(tblContentType.[Name] + '.' + propDef.[Name] + ',', @PropertiesToUpdate + ',') > 0;

-- update versions  
UPDATE tblWorkContentProperty
   SET tblWorkContentProperty.LongString = SUBSTRING(  -- start after `<links>`
          SUBSTRING(propValue.LongString, 0, CHARINDEX('</a>',  propValue.LongString) + 4), -- remove all text after first `</a>`
          8, 100000)
OUTPUT INSERTED.*, deleted.*
  FROM tblPropertyDefinition propDef
  JOIN tblPropertyDefinitionType propDefType ON propDefType.[Name] = 'LinkCollection'
   AND propDef.fkPropertyDefinitionTypeID = propDefType.pkID
  JOIN tblContentType ON tblContentType.pkID = propDef.fkContentTypeID
  JOIN tblWorkContentProperty propValue ON propValue.fkPropertyDefinitionID = propDef.pkID
 WHERE propValue.LongString LIKE '<links>%'
   AND CHARINDEX(tblContentType.[Name] + '.' + propDef.[Name] + ',', @PropertiesToUpdate + ',') > 0;

-- update property type
UPDATE tblPropertyDefinition
   SET tblPropertyDefinition.fkPropertyDefinitionTypeID = (SELECT pkID from tblPropertyDefinitionType where [Name] = 'LinkItem')
OUTPUT INSERTED.*, deleted.*
  FROM tblContentType
 WHERE tblPropertyDefinition.fkPropertyDefinitionTypeID = (SELECT pkID from tblPropertyDefinitionType where [Name] = 'LinkCollection') 
   AND CHARINDEX(tblContentType.[Name] + '.' + tblPropertyDefinition.[Name] + ',', @PropertiesToUpdate + ',') > 0;

Afterwards the Labs package can just be uninstalled.

Sep 14, 2022

Comments

error Please login to comment.
Latest blogs
Optimizely DXP: Every Supported Culture, One Searchable Page

Quick one for anyone building multi-language sites on Optimizely DXP. I put together a reference tool listing all 806 supported cultures. More...

Adnan Zameer | Jul 10, 2026 |

A day in the life of an Optimizely OMVP: London Meetup 2026

On 2nd July 2026 the Optimizely London Developer Meetup returned to The Lightwell, and the running theme across the evening was less about individu...

Graham Carr | Jul 10, 2026

Optimizely’s Summer ’26 Roadmap: The CMS Is Starting to Look Less Like a Publishing Tool and More Like Marketing Infrastructure

Optimizely’s Summer ’26 Product Roadmap event was not just a list of product updates. At least, that is not the part I found most interesting. The...

Augusto Davalos | Jul 9, 2026

Optimizely Content JS SDK v2.1.0 — What's New and Why It Matters

  v2.1.0 of the Optimizely Content JS SDK and CLI landed on July 7, 2026. This is a substantial release bringing a wave of capabilities for...

Vipin Banka | Jul 8, 2026