如何正确填充所有强类型属性的特定页面类型构建器类型的EPiServer页面?我可以在单个方法调用中执行此操作吗?
我尝试过使用:
ContentPageType pageAsContentPageType =
DataFactory.Instance.GetPage<ContentPageType>(page.PageLink);
然而,这不起作用。尽管我将其目标指定为ContentPageType,但它填充了PageData属性,但没有其他内容。
我已经在下面列出了违规代码,我已经广泛评论过:
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;
}
修改
以前,我尝试过以下操作,但它也不起作用:
ContentPageType pageAsContentPageType =
DataFactory.Instance.GetPage(page.PageLink) as ContentPageType
CMS5R2SP2的解决方案:
事实证明,IsMapEnabled页面类型属性中缺少虚拟关键字。因此,IoC容器不会从其默认值覆盖此属性。以下是最终实施:
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();
CMS6的解决方案:
OfType<ContentPageType>()
不起作用。所以,按照乔尔的说法,重新开始每一页的工作。
答案 0 :(得分:4)
带有type参数的GetPage方法是在最新版本的EPiServer CMS 5中引入的,并在版本6中删除。因此,假设您使用的是版本5而不是自定义扩展方法,答案就是不使用该方法使用类型参数,而只是将调用的结果转换为GetPage(假设您知道类型)。 换句话说,下面的代码应该可以正常工作:
ContentPageType pageAsContentPageType = (ContentPageType) DataFactory.Instance.GetPage(page.PageLink);
页面类型生成器拦截对GetPage的调用,并使用正确类型的代理替换返回的PageData对象。此代理拦截对属性的调用并返回值。换句话说,PTB类的实例从未实际填充过,但PTB可以拦截这些调用至关重要。
带有type参数的GetPage方法有点实验性,虽然它确实允许页面作为特定类型返回,但它不允许外部方(例如PTB)替换返回的对象。后来根据请求将其删除,以允许我们使用相同的签名创建扩展方法。
一些历史here。