smithsson68@gmail.com
Feb 18, 2010
  9949
(2 votes)

Changes to Page Objects API in CMS 6 Release

The upcoming final release of CMS 6 will introduce a couple of small changes in the way you load and save Page Objects compared to the RC1 version.

Following feedback and a few bug fixes we decided that mixing Page Objects with PageData and having to go through the DataFactory to save them was not going to work and was not the cleanest API.

This blogpost explains the RC1 way of doing things. In the rest of this post I will go through how to work with Page Objects in the CMS Release version.

The main class you will be interested in is the EPiServer.Core.PageObjectManager which can be found in the EPiServer.dll assembly. The most likely places you will be working with Page Objects are in a CMS Page Template, a CMS User Control or from Dynamic Content. In all 3 cases the PageData object is available and therefore the PageObjectManager takes a PageData in its constructor (there are other constructers available for other scenarios when PageData is not available). This tells the PageObjectManager to load and save Page Objects in the context of that page.

You can load Page Objects like this:

   1: PageData pageData = // Obtain the PageData instance to work with
   2:  
   3: // Construct a PageObjectManager with the PageData
   4: PageObjectManager pom = new PageObjectManager(pageData);
   5:  
   6: Rating rating = pom.Load<Rating>("Rating");
   7:  
   8: if (rating != null)
   9: {
  10:     // Do something with the rating
  11: }

 

You can also load all Page Objects for the page like this:

   1: PageData pageData = // Obtain the PageData instance to work with
   2:  
   3: // Construct a PageObjectManager with the PageData
   4: PageObjectManager pom = new PageObjectManager(pageData);
   5:  
   6: var objects = pom.LoadAll();
   7:  
   8: // Get the Rating object
   9: Rating rating = objects.ItemAs<Rating>("Rating");
  10:  
  11: if (rating != null)
  12: {
  13:     // Do something with the rating
  14: }

Note that the LoadAll method returns an IDictionary. The ItemAs<> method is an extension method added as part of the Page Objects implementation to obtain the object in a typed way.

Saving a Page Object is also straight forward:

   1: PageData pageData = // Obtain the PageData instance to work with
   2:  
   3: // Construct a PageObjectManager with the PageData
   4: PageObjectManager pom = new PageObjectManager(pageData);
   5:  
   6: Rating rating = pom.Load<Rating>("Rating");
   7:  
   8: // Update the rating or create a new one if null
   9:  
  10: // Save it back
  11: pom.Save("Rating", rating);

There is another overload of Save which takes a OwnerOption. I will go into this in more detail in a later blog post.

What all this means is that if you have already started building sites with CMS 6 RC1 and have used Page Objects you will unfortunately need to make these small codes changes for obtaining and saving Page Objects. If anybody also needs to preserve their Page Object instances between RC1 and the release version then please email me paul smith episerver com and I will provide you will a small script to do this.

Feb 18, 2010

Comments

Sep 21, 2010 10:33 AM

So, are Page Objects orthogonal to versioning of page data now?

Sep 21, 2010 10:33 AM

Well, I'm not totally sure what you mean by orthogonal in context, if you mean independent of each other then the answer is not really.
Page Objects are not versioned as such, there is no magic going on in the background when a page is versioned to copy the Page Objects. When a Page Objects is created it is assigned an OwnerOption with the options being Page, PageLanguageBranch and PageVersion. So you decide how your Page Objects are shared between different versions/languages of a page. I will blog more shortly.
/Paul
/ Paul Smith

Sep 21, 2010 10:33 AM

I like this API a lot better than the previous one. A good change!

Sep 21, 2010 10:33 AM

Will there be a method to get the page data objects based on PageReference instead of pagedata object?

/ Anders Hattestad

Please login to comment.
Latest blogs
Plug-in manager is back in CMS 12

Plug-in manager is back in the UI, what is it and how can i use it?

Luc Gosso (MVP) | Oct 6, 2022 | Syndicated blog

Display Child Pages in Content Delivery API Response

The below example will implement an instance of IContentConverterProvider to customise the serialisation of PageData and output child pages in the...

Minesh Shah (Netcel) | Oct 4, 2022

Bring the Report Center back in Optimizely CMS 12

The Report Center has been a part of Optimizely CMS since its first debut in version 5R2 in 2008, but in CMS 12, it's removed! Don't despair! Make...

Tomas Hensrud Gulla | Oct 4, 2022 | Syndicated blog

Customizing Property Lists in Optimizely CMS

Generic property lists is a cool editorial feature that has gained a lot of popularity - in spite of still being unsupported (officially). But if y...

Allan Thraen | Oct 2, 2022 | Syndicated blog

Optimizely names Luminary Senior Developer, Ynze Nunnink, OMVP

Luminary Senior Developer and Optimizely Lead, Ynze Nunnink has secured the coveted position of Optimizely MVP. Earning a Platinum badge for his...

Ynze | Oct 2, 2022 | Syndicated blog

Content Delivery API – The Case of the Duplicate API Refresh Token

Creating a custom refresh provider to resolve the issues with duplicate tokens in the DXC The post Content Delivery API – The Case of the Duplicate...

David Lewis | Sep 29, 2022 | Syndicated blog