EPiServer: Auto-create child pages on ‘Add New Page’

I spent almost a day trying to figure this out. I’ve seen heaps of examples on the internet on how to programmatically create pages in EPiServer, but it was a struggle finding a resource that explained where we can do this. Or where we can insert such code. When I finally found a solution, I felt proud. And happy. And this lead me to creating a new blog. Yay for my very first post!

Problem: On add of a new page via the EPiServer Edit page, the system should determine if the page type selected requires children to be created automatically under it.

Solution: We need two things: A new Attribute that can be attached to page types. And a class of the IInitializableModule (EPiServer.Framework) which intercepts creation of pages, checking if the page type has this new Attribute. If it does, it will call a method that will create children under it.

Sounds simple right? But I was new to EPiServer, still am actually. So I thought of creating a blog where I can write about my journeys in EPiServer hoping that someday these struggles I have and the ones I will be going through can be avoided in the future by someone like you who happens to have found my page.

So here’s how my Attribute class looks like

 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]  
 public class EnsureSubPageAttribute : Attribute  
 {  
     public Type PageType { get; set; }    
     public string PageName { get; set; }    
     public string UrlSegment { get; set; }    
     public int SortIndex { get; set; }    
     public string SetReferenceToProperty { get; set; }    
     public string[] SetPropertyNames { get; set; }    
     public string[] SetPropertyValues { get; set; }  
 }  

And then create a Class that goes by the interface IInitializableModule.
Implement members by attaching an event handler when a page is created.

 [InitializableModule]  
 public class EnsureSubPages : IInitializableModule  
 {  
     #region IInitializableModule Members  
     public void Initialize(InitializationEngine context)  
     {  
       DataFactory.Instance.CreatedPage += Instance_CreatedPage;   
     }  
     public void Uninitialize(InitializationEngine context)  
     {  
       DataFactory.Instance.CreatedPage -= Instance_CreatedPage;  
     }  
     #endregion  

Then of course, implement the event handler method.

Once this is implemented, we go ahead and attach the attribute to the appropriate page types.
Here’s an example:

 [EnsureSubPage(  
     PageType = typeof(ChildPage),  
     UrlSegment = "give-it-a-url")]  
 public class AutoParentPage : SitePageData  
 {  
 }  

Any questions, just comment! Thanks

Discover more from Nicola Ayan

Subscribe now to keep reading and get access to the full archive.

Continue reading