我有两个不同的PageTypes列表 - NewsItems和PressReleases。它们分别显示在一个列表中,并带有指向各个项目的链接。
现在我想将新闻稿项目包含在新闻列表中,并使用新闻项目的样式将它们显示为新闻项目。它们共享“Heading”和“BodyText”等属性,这些属性在新闻模板中使用。
我想用两组页面来提供NewsItems的ListPage并不困难,但我不明白如何控制项目页面的呈现。
我想从NewsItem或PressReleaseItem获取PageData对象,并使用News-Item.aspx模板显示它,如果在NewsList中选择它。但是,EPiServer将始终使用PR-Item.aspx呈现PressReleaseItem,因为它在PageType设置中耦合。
任何人都知道如何做到这一点?
编辑:努力澄清:
重要的问题是如何知道“列表父”并从中选择正确的模板。在ListPage中,我可以使用tompipes answer分别在PR和News项目上应用不同的外观,但是当选择查看单个项目时,EPi将以相同的方式呈现PR-Item-1,而不管它们的“list parent”。这就是问题所在。
答案 0 :(得分:2)
我没有完全遵循你在这里尝试的内容。但我认为我得到了它的主旨。
为什么不对两种页面类型使用一个aspx模板,而是在使用visible属性关闭部分后面的代码中。
如果您使用的是PageTypeBuilder,则可以使用“is”关键字:
somePlaceHolder.Visible = CurrentPage is NewsItemList;
如果您不使用PTB,可以使用以下内容:
somePlaceholder.Visble = CurrentPage.PageTypeID == 10;
或
somePlaceholder.Visble = CurrentPage.PageTypeName == "NewsItemList";
我现在要指出,我不是硬编码任何东西的粉丝,所以我会将模板名称或ID放入配置文件或开始/根页面上的属性,以避免硬编码。
请告诉我这是否会有所帮助,或者如果我误解了,请尝试详细说明您的问题。
答案 1 :(得分:1)
根据模板共享的程度,您可以使用用户控件,占位符甚至不同的主页以合适的方式切换视图。
要知道何时切换,您可以使用查询字符串参数,会话变量或最好看的方式可能是查找并通过HTTP引用来获取列表的PageData对象。如果它是空的,你将获得新闻稿渲染作为最坏的情况。
答案 2 :(得分:0)
我尝试了很多解决方案,包括在列表链接中的PR项目中添加查询字符串,在项目模板中获取引用URL以及从PR项目自动发布新闻项目的不同类型的事件挂钩(尽管我只看了那个代码样本,最后得出的结论是,他们都有一些东西告诉我不要这样做。 (使代码过于复杂,或标记逻辑太难理解等等)
我最终使用Fetch data from another EPiServer page
,并创建了一个“快捷页面类型”,让我的编辑选择哪个PR项目作为新闻项目的基础。
此快捷方式页面类型称为“PR-as-news-itemPage”,它使用与普通新闻项相同的aspx呈现:News-Item.aspx。如果没有自己的属性,它将使用“获取...”
选择PR项目中的所有相关数据为了呈现具有所有属性的PR项目,我创建了一个名为PR-Item.aspx的普通新页面类型。这将呈现“属性2”属性,该属性仅由PR-item.aspx呈现,而不是由News-Item.aspx呈现。
(我可以更简单,让编辑使用旧的News-Item页面类型并在那里使用“Fetch ...”属性,但我在该页面类型中有一些强制属性,但我没有我想为此选择。)