【问题标题】:Render a page differently based on which list that opened it根据打开页面的列表以不同方式呈现页面
【发布时间】:2011-11-28 17:48:48
【问题描述】:

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

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

我想用两组页面提供 NewsItems 的 ListPage 不会那么困难,但我不明白如何控制项目页面的呈现。

我想从 NewsItem 或 PressReleaseItem 中获取 PageData 对象,并使用 News-Item.aspx 模板显示它,如果它在 NewsList 中被选中的话。但 EPiServer 将始终使用 PR-Item.aspx 呈现 PressReleaseItem,因为它在 PageType 设置中耦合。

有人知道怎么做吗?

编辑:努力澄清:

重要的问题是如何知道“列表父级”并从中选择正确的模板。 In the ListPage I can apply different looks on the PR and News items respectively using tompipes answer, but when selecting to see an individual item EPi will render the PR-Item-1 the same way regardless of their "list parent".这就是问题所在。

【问题讨论】:

    标签: episerver


    【解决方案1】:

    我并没有完全按照您在此处尝试的内容进行操作。但我想我明白了它的要点。

    为什么不对两种页面类型使用一个 aspx 模板,而是在代码后面使用可见属性关闭部分。

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

    somePlaceHolder.Visible = CurrentPage is NewsItemList;
    

    如果你不使用 PTB,你可以使用类似的东西:

    somePlaceholder.Visble = CurrentPage.PageTypeID == 10;
    

    somePlaceholder.Visble = CurrentPage.PageTypeName == "NewsItemList";
    

    我现在要指出,我不喜欢硬编码任何东西,所以我会将模板名称或 ID 放入配置文件或开始/根页面上的属性中以避免硬编码。

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

    【讨论】:

    • 这听起来既简单又聪明,将查看我的代码,看看它是否解决了它,谢谢!
    • 其实并没有解决问题。加载项目页面时,我想知道打开它的页面并从中选择布局。不过,您的解决方案在列表视图中效果很好。
    【解决方案2】:

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

    要知道何时切换,您可以使用查询字符串参数、会话变量或最好的方式可能是通过 HTTP 引用者查找并获取列表的 PageData 对象。如果它是空的,您将在最坏的情况下获得新闻稿渲染。

    【讨论】:

    • “通过 HTTP 引用者获取列表的 PageData 对象”听起来很棒,这是怎么做到的?
    • 看看 ConvertToInternal... 这应该可以帮助您:world.episerver.com/Modules/Forum/Pages/thread.aspx?id=41533
    • 谢谢!从我的其他来源,我开始意识到带有引用 url 的请求参数是不可依赖的。
    【解决方案3】:

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

    我最终使用了Fetch data from another EPiServer page,并创建了一个“快捷页面类型”,让我的编辑选择应该将哪个 PR 项目用作新闻项目的基础。

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

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

    (我本可以更简单,让编辑使用旧的 News-Item 页面类型并在那里使用“Fetch...”属性,但我在该页面类型中有一些我没有的强制属性为了这个缘故,我想把它设为可选。)

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多