【问题标题】:Best way to render arbitrary number of heterogenous Items?呈现任意数量的异构项目的最佳方法?
【发布时间】:2011-08-16 00:05:33
【问题描述】:

我的网站上有一个结帐页面,其中列出了客户正在购买的商品...在基本列表下方是“详细发票”部分,他们可以在其中查看每个商品的具体信息。到目前为止,我只有两种不同类型的可以购买的物品,所以详细的清单很容易处理。现在我添加了四个额外的、完全不同的可购买的东西......所以问题是:使用 Sitecore 子布局处理这种渲染的好方法是什么? (目前,我只使用中继器并隐藏/显示适当的字段)

好消息是,订单中的每个订单项都有一个关联的 Sitecore Item 实例。如果 Sitecore API 更适合面向对象的方法,我可能会在我的每个相关对象类型上创建一个 Render() 方法。但当然,它们都是 Sitecore.Data.Items.Item 对象。子类项目?对于这项任务来说,这似乎有点过头了……

我考虑过为每个不同的项目类型设置一个子布局/用户控件...然后将它们动态添加到发票页面上的占位符。这似乎是合理的......想法?缺点是丑陋的代码必须将用户控件与项目匹配...可能基于 TemplateID?

无论如何,只是在这里寻找一些建议。

【问题讨论】:

    标签: asp.net sitecore sitecore6


    【解决方案1】:

    构建类来表示 Sitecore 数据并不是一个不合理的想法。这是一个完美的场景。每当我构建项目时,我总是使用Custom Item Generator 生成类,以防我需要特定于模板的字段访问。我也将所有内容都作为子布局来做,这样我就可以看到你的困境。

    每个产品的所有/大部分字段都是唯一的吗?您没有每个产品实例使用的通用产品模板吗?

    这些是我自己能想到的选项(IMO 从最差到最好):

    1. 创建一个类来表示每个唯一的模板。 Custom Item Generator 可能有效,但第一次可能会让您感到困惑。您始终可以创建自己的类,在其中将 Sitecore 项传递给构造函数并创建属性以访问字段。然后使用常规的 .NET 控件并将数据绑定到前端,具体取决于您的项目使用的模板并使用模板的强类型类。这可能是许多if-else 的杂乱代码。

    2. 为 Sitecore 中的每个独特模板创建一个独特的子布局。在循环项目的中继器中,根据项目的模板,使用new Sublayout() 将正确的子布局添加到占位符,并将DataSource 设置为Sitecore 项目(这里是code to access the DataSource)。这样您就可以将实现抽象为每个唯一模板。

    3. 为#1 中提到的每个模板创建类,但使用接口抽象它们。在中继器的ItemDataBound 中,通过接口实现数据。这在很大程度上取决于字段如何在模板之间进行比较和对比。如果您可以强迫自己将唯一字段减少到接口的成员中,那么表示模板的每个类都可以实现您的接口。这允许将来添加更多独特的模板,只要您继续实现该接口。

    【讨论】:

    • 对于选项#2...为什么要使用“new Sublayout()”而不是标准的 UserControl? Sitecore 会在这里给我买东西吗?我的直觉告诉我这将是一个更大的障碍,因为一些内部逻辑(黑魔法?)对我来说是隐藏的。
    • 因为如果您使用子布局,您可以将带有数据的实际 Sitecore 项目作为DataSource(我提供了有关如何通过 C# 访问它的链接)传递给子布局。作为常规用户控件,您将如何访问特定项目?我们不是在这里谈论上下文项目,对吧?我们正在讨论具体的逐项详细项目。
    • 啊,好的。我通常会在我的控件中添加一个 Item 属性,这样我就可以在 Repeater 中绑定一个 Item 列表或数组,然后在像 Item= 这样的模板中设置它。这样它就与其他 Sitecore 控件保持一致。
    • 我明白了。如果您为每个模板创建包装类,那么您的转发器不会得到List<Sitecore.Data.Items.Item>,而是List<IProduct>,其中IProduct 是我建议您写入的接口。
    【解决方案2】:

    对我来说,这似乎是一个使用“控制的呈现反转”Sitecore 模式(由 Aware Web 命名)的好地方。

    http://www.awareweb.com/AwareBlog/Presentation%20Inversion%20of%20Control%20part%202.aspx

    虽然博客文章更多地在用户放置项目的上下文中讨论了这一点,但它也适用于此。如果您有每个产品类型的模板,您可以在每个(可能在单独的设备中)定义演示详细信息,定义可以在购物车中呈现该项目的控件。然后,您可以从项目中读取 RenderingReference,并将它们放入页面中。这形成了一个灵活、可扩展的系统,允许您为不同类型的产品处理不同的输出。

    这与您描述的解决方案(每种产品类型的子布局)接近,但允许子布局是数据驱动的,而不是每个 TemplateID 的条件逻辑。 (请注意,您还需要在演示详细信息中分配一个虚拟的“主布局”。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多