如何获取特定页面类型构建器类型的EPiServer页面,并正确填充其所有强类型属性?

时间:2011-07-09 09:10:11

标签: c# episerver

如何正确填充所有强类型属性的特定页面类型构建器类型的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>()不起作用。所以,按照乔尔的说法,重新开始每一页的工作。

1 个答案:

答案 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