C# 如何正确填充特定页面类型生成器类型的epserver页面的所有强类型属性?

C# 如何正确填充特定页面类型生成器类型的epserver页面的所有强类型属性?,c#,episerver,C#,Episerver,如何正确填充特定页面类型生成器类型的epserver页面的所有强类型属性?我可以在一个方法调用中执行此操作吗 我试过使用: ContentPageType pageAsContentPageType = DataFactory.Instance.GetPage<ContentPageType>(page.PageLink); CMS5R2SP2的解决方案: 原来IsMapEnabled page type属性中缺少一个虚拟关键字。因此,IoC容器没有从其默认值重写此属性

如何正确填充特定页面类型生成器类型的epserver页面的所有强类型属性?我可以在一个方法调用中执行此操作吗

我试过使用:

ContentPageType pageAsContentPageType =  
    DataFactory.Instance.GetPage<ContentPageType>(page.PageLink);
CMS5R2SP2的解决方案:


原来IsMapEnabled page type属性中缺少一个虚拟关键字。因此,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();
IList pages=PageFactory.GetPages(
PageReference.StartPage.ID,
BaseSettings.Constants.EPiServer.PageTypeNames.ContentPage
);
//某些内容页将是启用映射的页。
//所以,我们需要提取那些放在这个变量中的变量。
IEnumerable MapEnabledPage=
从第页到第页。of type()
page.IsMapEnabled的位置
选择页面;
//返回启用映射的页面。
返回mapEnabledPages.ToList();
CMS6的解决方案:


类型()的
无效。因此,重新设置每个页面的工作方式与Joel所说的一样。

带有类型参数的GetPage方法在EPiServer CMS 5的最新版本中引入,并在版本6中删除。因此,假设您使用的是版本5,而不是自定义扩展方法,那么答案就是不使用带有type参数的方法,而只是转换调用GetPage的结果(假设您知道类型)。 换句话说,下面的代码应该可以正常工作:

ContentPageType pageAsContentPageType = (ContentPageType) DataFactory.Instance.GetPage(page.PageLink);
页面类型生成器拦截对GetPage的调用,并用正确类型的代理替换返回的PageData对象。此代理拦截对属性的调用并返回值。换句话说,PTB类的实例从未实际填充过,但PTB能够拦截调用是至关重要的


带有type参数的GetPage方法在某种程度上是实验性的,虽然它允许将页面作为特定类型返回,但不允许外部方(如PTB)替换要返回的对象。后来,每个请求都删除了它,以允许我们创建具有相同签名的扩展方法


一些历史记录。

我已经尝试过:ContentPageType pageAsContentPageType=DataFactory.Instance.GetPage(page.PageLink)作为ContentPageType-这是一样的?是的,如果转换失败,则使用as作为结果将为null,而使用强制转换时会引发异常。我现在注意到,您使用的是GetPages(),由于EPiServer中的错误,它不会返回正确类型的页面,因为它不允许事件侦听器替换返回的对象。使用AsTyped扩展方法修复该问题(即GetPages(…).AsTyped()。是的,我相信我的factory方法会调用该方法(在我开始工作时会发现)。我会试试看;这听起来更有希望-感谢IsMapEnabled属性上缺少虚拟关键字。这是最后的实现(请编辑)。
    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();
ContentPageType pageAsContentPageType = (ContentPageType) DataFactory.Instance.GetPage(page.PageLink);