Vulnerability in EPiServer.Forms

Try our conversational search powered by Generative AI!

Alexander Haneng
Aug 16, 2012
(4 votes)

How to develop EPiServer 7 sites that are easy to use for editors.

EPiServer 7 makes being an editor much easier, but there are pitfalls. I take a look at what they are and some development best practices for making EPiServer 7 super user friendly for editors. Note: This blog post is based on EPiServer 7 Preview.


The new editor UI

EPiServer 7 introduces a brand new UI to working with content for editors bringing elements of classic EPiServer forms, WYSWIG editing and Composer like blocks. In combination these elements can make sites even easier for editors to manage, but it requires that you use the new powerful tools in a smart way.


Editing a page

With the new editor UI the editing is done by clicking on  elements shown in the page preview, and then you can edit that piece of content. For small texts like headings the editing is done on the page, while longer texts, images etc. will open a small dialog box where the content can be edited.




Clicking the heading turns it into a text field that can be edited. (property type: short string)




Clicking the body text opens a window where the text can be edited (property type: XHTML string)


This makes being an editor easier since one does not have to hunt through all the property fields in a long form to find the one that changes the heading text!



Where the f*** do I edit that?

Say you have a list of pages somewhere on your site and you want to make changes to the list. Where do you do that?




It could be in one of several places:

-property on the page
-property on a settings tab on the start page or some special settings page
-a dynamic property (on this page or inherited from some other page)
-defined in app settings in web.config

Or, if you are unlucky, it is hard coded into the page. Either way: good luck finding out!


With the new UI the editor can go to the start page and simply click the element containing the list to edit it. Sweet!



Simply click the list and you will be able to edit it.


This of course requires a few things for it to work:

1. The list must be a LinkItemCollection property on the start page

2. You have to be on the start page to be able to click it in edit mode.


Make sure your editors can edit “everything” by clicking elements in the UI!

In EPiServer 7 you can of course still hard code the list or do it store it in web.config, but the point of this blog post is that you should take advantage of this new feature and make sure that “everything” on the site can be edited by clicking the element in the UI.


Trust me: the editors will thank you for it! And so will your support guys when the customer calls two years from now and asks how they can change the list. (And you won’t have to try to remember when the support guy calls you to find out).


Visible vs invisible properties

Of course not all properties are visible to the editor in the new UI. For example if you have a number property where the editor can decide how many elements should be shown in the list. It will not show up as a number that the editor can click and change. So for that reason EPiServer 7 also has forms editing.


Click the toggle forms editing button in the top right corner to turn on forms editing



Forms editing mode where the editor can change the number of elements in the list.


This of course works fine, but then we are back to the old “hunting for properties on tabs” routine.


Blocks to the rescue

By using the new concept of blocks (think of them as groups of properties for now) we can group the properties used for listing pages together. In our example we have 4 properties on the page that controls a list of pages:
-List heading
-Source page to get child pages from
-Max number of items to show
-What order to sort the pages


We now group the properties into a ListBlock block and add a ListBlock property to the page type.


What we see now is that the whole list becomes a clickable element, and once clicked it will show a dialog box showing just the relevant properties!



Clicking on the list displays only the relevant properties in a dialog box.

Creating this as a block also makes it possible to reuse this group of properties on other page types and you can also have multiple lists on a single page type. Perfect!



In conclusion: Use the power of EPiServer 7 wisely

With new EPiServer 7 UI you can make a site even easier to edit for editors, but it requires that you think through how you structure properties, pages and blocks. Good luck!



Source code: How to create the ListBlock

For an introduction to creating blocks in EPiServer 7 read this blog post. Below is the source code used to create the simple ListBlock shown above.



using System.ComponentModel.DataAnnotations;
using EPiServer.Core;
using EPiServer.DataAbstraction;
using EPiServer.DataAnnotations;
using EPiServer.SpecializedProperties;
namespace EPiServer.Templates.AlloyTech.BlockTypes
    [ContentType(DisplayName = "Page list block", 
        Description = "Block to list pages")]
    public class PageListBlock : BlockData
            Name = "List heading",
            Description = "",
            GroupName = SystemTabNames.Content,
            Order = 1)]
        public virtual string ListHeading { get; set; }
            Name = "List children of the page",
            Description = "",
            GroupName = SystemTabNames.Content,
            Order = 2)]
        public virtual PageReference SourcePage { get; set; }
            Name = "Max number of pages to show",
            Description = "",
            GroupName = SystemTabNames.Content,
            Order = 3)]
        [Range(1, 250)]
        public virtual int MaxNumberOfPages { get; set; }
        [BackingType(typeof (PropertySortOrder))]
            Name = "Sort the pages by",
            Description = "",
            GroupName = SystemTabNames.Content,
            Order = 4)]
        public virtual int SortOrder { get; set; }




<%@ Control Language="C#" AutoEventWireup="true" 
    Inherits="EPiServer.Templates.AlloyTech.Blocks.PageListBlockControl" %>
<EPiServer:Property ID="Heading" PropertyName="Listheading" 
    CustomTagName="h2" runat="server"/>
<EPiServer:PageList ID="PageList" PageLinkProperty="SourcePage" runat="server">
    <ItemTemplate><li><%# Container.CurrentPage.PageName %></li></ItemTemplate>




using System;
using EPiServer.Templates.AlloyTech.BlockTypes;
using EPiServer.Web;
namespace EPiServer.Templates.AlloyTech.Blocks
    public partial class PageListBlockControl : BlockControlBase<PageListBlock>
        protected void Page_Load(object sender, EventArgs e)
            //Set the max number of pages to show based on the 
            //property MaxNumberOfPages 
            PageList.MaxCount = CurrentBlock.MaxNumberOfPages;
            //Set the sort order based on the property SortOrder
            PageList.SortOrder = (Filters.FilterSortOrder) CurrentBlock.SortOrder;
Aug 16, 2012


Please login to comment.
Latest blogs
Stop Managing Humans in Your CMS

Too many times, a content management system becomes a people management system. Meaning, an organization uses the CMS to manage all the information...

Deane Barker | Nov 30, 2023

A day in the life of an Optimizely Developer - Optimizely CMS 12: The advantages and considerations when exploring an upgrade

GRAHAM CARR - LEAD .NET DEVELOPER, 28 Nov 2023 In 2022, Optimizely released CMS 12 as part of its ongoing evolution of the platform to help provide...

Graham Carr | Nov 28, 2023

A day in the life of an Optimizely Developer - OptiUKNorth Meetup January 2024

It's time for another UK North Optimizely meet up! After the success of the last one, Ibrar Hussain (26) and Paul Gruffydd (Kin + Carta) will be...

Graham Carr | Nov 28, 2023

Publish content to Optimizely CMS using a custom GPT from OpenAI 🤖

Do you find the traditional editor interface complicated and cluttered? Would you like an editorial AI assistant you can chat with? You can!

Tomas Hensrud Gulla | Nov 28, 2023 | Syndicated blog

Optimizely Graph and Next.js: Building Scalable Headless Solutions

Optimizely Graph harnesses the capabilities of GraphQL, an intuitive and efficient query language to, transform content within an Optimizely CMS in...

Szymon Uryga | Nov 27, 2023

Getting Started with Optimizely SaaS Core and Next.js Integration: Testing Content Updates

The blog post discusses the challenges of content updates on a website using Optimizely CMS, Next.js, and the Apollo Client due to Apollo's local...

Francisco Quintanilla | Nov 27, 2023 | Syndicated blog