How to get an EPiServer page of a certain type of page type type with all its strongly typed properties correctly populated?

How to get an EPiServer page of a certain type of page type type with all its strongly typed properties correctly populated? Can I do this with one method call?

I tried using:

ContentPageType pageAsContentPageType = DataFactory.Instance.GetPage<ContentPageType>(page.PageLink); 

However, this does not work. It fills the PageData properties, but nothing else, even though I specify its target as ContentPageType.

I included the violation code below, which I commented in detail:

 public static IList<ContentPageType> GetMapEnabledPages() { // Get the content pages IList<PageData> pages = PageFactory.GetPages( PageReference.StartPage.ID, BaseSettings.Constants.EPiServer.PageTypeNames.ContentPage ); // Some content pages will be map enabled pages. So, we need to extract the ones that are put them in this variable. IList<ContentPageType> mapEnabledPages = new List<ContentPageType>(); // walk pages to extract only map enabled pages foreach (PageData page in pages) { // get the page as a ContentPageType. // unfortunately, this method only populates the PageData information and none of the additional strongly types properties that a ContentPageType has. // we would expect this happen because EPiServer uses IoC elsewhere but does not do it here. ContentPageType pageAsContentPageType = DataFactory.Instance.GetPage<ContentPageType>(page.PageLink); // So, we fudge it - we know that the PageData weakly type properties has IsMapEnabled correctly populated. // So, we put that value in the strongly typed ContentPageType property. if (pageAsContentPageType != null && pageAsContentPageType["IsMapEnabled"] != null) { // put that the weakly typed property for "IsMapEnabled" into the strongly typed ContentPageType IsMapEnabled property pageAsContentPageType.IsMapEnabled = TypeHelper.ConvertToBoolean(pageAsContentPageType["IsMapEnabled"].ToString()); // check if it is map enabled if (pageAsContentPageType.IsMapEnabled) { // it is a map enabled page. So, add it to the mapEnabledPages list. mapEnabledPages.Add(pageAsContentPageType); } } } return mapEnabledPages; } 

EDIT:

I tried the following before, but it doesn’t work either:

 ContentPageType pageAsContentPageType = DataFactory.Instance.GetPage(page.PageLink) as ContentPageType 

SOLUTION FOR CMS5R2SP2:

It turned out that the property of the IsMapEnabled page property was missing a virtual keyword. Therefore, the IoC container did not override this default property. Here is the final implementation:

  IList<PageData> pages = PageFactory.GetPages( PageReference.StartPage.ID, BaseSettings.Constants.EPiServer.PageTypeNames.ContentPage ); // Some content pages will be map enabled pages. // So, we need to extract the ones that are put them in this variable. IEnumerable<ContentPageType> mapEnabledPages = from page in pages.OfType<ContentPageType>() where page.IsMapEnabled select page; // return map enabled pages. return mapEnabledPages.ToList(); 

SOLUTION FOR CMS6:

OfType<ContentPageType>() does not work. Thus, the regeneration of each page works, as Joel said.

+4
source share
1 answer

The GetPage method with type parameter was introduced in the latest version of EPiServer CMS 5 and removed in version 6. So, assuming you are using version 5 and not your own extension method, the answer is simply not to use a method with type parameter and instead just pass result of calling GetPage (assuming you know the type). In other words, the code below should work fine:

 ContentPageType pageAsContentPageType = (ContentPageType) DataFactory.Instance.GetPage(page.PageLink); 

Page Type Builder intercepts GetPage calls and replaces the returned proxy server PageData with the correct type. This proxy intercepts property calls and returns values. In other words, instances of PTB classes are never populated, but it is vital that PTB can intercept calls.

The GetPage method with the type parameter was somewhat experimental, and although it allowed pages to be returned as a specific type, it did not allow external parties (such as PTB) to replace the returned object. It was later deleted for each request so that we can create extension methods with the same signature.

Some story here .

+4
source

All Articles