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.