Episerver 根据打开页面的列表以不同方式呈现页面

Episerver 根据打开页面的列表以不同方式呈现页面,episerver,Episerver,我有两个不同页面类型的列表——新闻条目和新闻稿。它们分别显示在一个列表中,并带有指向各个项目的链接 现在,我想将新闻稿条目包括到新闻列表中,并使用新闻条目的样式将其显示为新闻条目。它们共享新闻模板中使用的“标题”和“正文”等属性 我想用这两组页面为NewsItems的ListPage提供信息并不困难,但我不明白如何控制项目页面的呈现 我想从NewsItem或PressReleaseItem中获取PageData对象,并使用News-Item.aspx模板显示它(如果在新闻列表中选中)。但是EPi

我有两个不同页面类型的列表——新闻条目和新闻稿。它们分别显示在一个列表中,并带有指向各个项目的链接

现在,我想将新闻稿条目包括到新闻列表中,并使用新闻条目的样式将其显示为新闻条目。它们共享新闻模板中使用的“标题”和“正文”等属性

我想用这两组页面为NewsItems的ListPage提供信息并不困难,但我不明白如何控制项目页面的呈现

我想从NewsItem或PressReleaseItem中获取PageData对象,并使用News-Item.aspx模板显示它(如果在新闻列表中选中)。但是EPiServer将始终使用PR-Item.aspx呈现PressReleaseItem,因为它与PageType设置耦合

有人知道如何做到这一点吗

编辑:努力澄清:

重要的问题是如何知道“列表父项”并从中选择正确的模板。在ListPage中,我可以使用tompipes answer分别对PR和新闻项目应用不同的外观,但是当选择查看单个项目时,EPi将以相同的方式呈现PR-item-1,而不管它们的“列表父项”是什么。这就是问题所在


我没有完全理解您在这里所做的尝试。但我想我明白了要点

为什么不为这两种页面类型使用一个aspx模板,而是在代码隐藏中使用visible属性关闭部分

如果您使用的是PageTypeBuilder,则可以使用“is”关键字:

如果您不使用PTB,您可以使用以下内容:

somePlaceholder.Visble = CurrentPage.PageTypeID == 10;

我现在要指出,我不喜欢硬编码,所以我会将模板名称或ID放入配置文件中,或者放入start/root页面上的属性中,以避免硬编码


让我知道这是否有帮助,或者如果我有误解,请尝试详细说明您的问题。

根据模板共享的程度,您可以使用用户控件、占位符甚至不同的母版页以适当的方式切换视图


要知道何时切换,可以使用querystring参数、会话变量,或者最好的方法可能是通过HTTP Referer查找并获取列表的PageData对象。如果是空的,最坏的情况是新闻稿呈现。

我尝试了很多解决方案,包括在列表链接中的PR项目中添加querystring,在项目模板中获取引用url,以及从PR项目自动发布新闻项目的不同类型的事件挂钩(虽然我只看了那一个的代码示例),最后得出结论,他们都有一些东西告诉我不要那样做。(使代码太复杂,或者标记逻辑太难理解等等)

最后,我使用了
从另一个EPiServer页面获取数据,并创建了一个“快捷页面类型”,在该页面中,我让编辑选择哪个公关项目应该用作新闻项目的基础

此快捷方式页面类型称为“PR as news itemPage”,它使用与普通新闻项相同的aspx呈现:news-Item.aspx。它没有自己的属性,将从使用“Fetch…”选择的PR项中获取所有相关数据

为了呈现PR项目及其所有属性,我创建了一个名为PR-Item.aspx的普通新页面类型。这将呈现“属性2”属性,该属性仅由PR-Item.aspx呈现,而不是由News-Item.aspx呈现


(我本来可以更简单一些,让编辑使用旧的新闻条目页面类型并在那里使用“Fetch…”属性,但我在该页面类型中有一些强制属性,因此我不想将其设置为可选。)

这听起来简单而聪明,我会查看我的代码,看看它是否解决了问题,谢谢!实际上它并没有解决问题。当项目页面加载时,我想知道哪个页面打开了它,并从中选择布局。不过,你的解决方案在列表视图中效果很好。“通过HTTP Referer获取列表的PageData对象”听起来棒极了,这是怎么做到的?看看ConvertToInternal…这应该会让你明白:谢谢!从我的其他来源,我开始意识到请求参数和引用url是不可依赖的。
somePlaceholder.Visble = CurrentPage.PageTypeID == 10;
somePlaceholder.Visble = CurrentPage.PageTypeName == "NewsItemList";