我的网站上有一个结帐页面,其中列出了客户正在购买的商品......在基本列表下方是“详细发票”部分,他们可以在其中查看每个商品的具体信息。直到现在我只有两种不同类型的商品可以购买,所以详细列表相当容易处理。现在我添加了四个可购买的额外且完全不同的东西......所以问题是:使用Sitecore子布局处理这种渲染的好方法是什么? (目前,我只使用Repeater并隐藏/显示相应的字段)
好消息是,对于订单中的每个订单项,都有一个关联的Sitecore Item实例。如果Sitecore API更适合面向对象的方法,我可以在我讨论的每个对象类型上创建一个Render()方法。但当然它们都是Sitecore.Data.Items.Item对象。子类项目?对于这项任务来说,这似乎有些过分......
我考虑的是每个不同项目类型的子布局/用户控件...然后将它们动态添加到发票页面上的占位符。这看似合理......思考?缺点是必须将用户控件与项目匹配的丑陋代码...基于TemplateID可能吗?
无论如何,只是在这里寻找一些建议。
答案 0 :(得分:2)
构建代表Sitecore数据的类不是一个不合理的想法。这是一个完美的方案来做到这一点。每当我构建项目时,我总是使用Custom Item Generator生成类,以防我需要特定于模板的字段访问。我也做了所有事情作为子布局,所以我可以看到你的困境。
每个产品的所有/大部分字段都是唯一的吗?您没有每个产品实例使用的通用产品模板吗?
这些是我能想到的选择(最差的IMO):
创建一个表示每个唯一模板的类。 Custom Item Generator可能会有效,但第一次可能会让您感到困惑。您始终可以创建自己的类,将Sitecore项目传递到构造函数中,并创建属性以访问字段。然后使用常规.NET控件并根据项目使用的模板将数据绑定到前端,并使用模板的强类型类。这可能是许多if-else
的混乱代码。
为Sitecore中的每个唯一模板创建一个唯一的子布局。在您的转发器中,根据项目的模板循环,使用new Sublayout()
将正确的子布局添加到占位符,并将DataSource
设置为Sitecore项(此处为code to access the DataSource) 。这样您就可以将实现抽象到每个唯一模板。
为#1中提到的每个模板创建类,但是使用接口对它们进行抽象。在转发器的ItemDataBound
中,通过界面实现数据。这在很大程度上取决于字段与模板之间的比较和对比。如果您可以强制自己将唯一字段缩减为接口的成员,那么表示模板的每个类都可以实现您的接口。这样,只要您继续实施界面,就可以在将来添加更多独特的模板。
答案 1 :(得分:1)
这对我来说似乎是一个使用“演示反转控制”Sitecore模式(由Aware Web命名)的好地方。
http://www.awareweb.com/AwareBlog/Presentation%20Inversion%20of%20Control%20part%202.aspx
虽然博客文章在用户放置的项目的上下文中更多地讨论了这一点,但它也适用于此。如果您有每种产品类型的模板,则可以在每个产品类型(可能在单独的设备中)定义演示文稿详细信息,以定义可以在购物车中呈现该项目的控件。然后,您可以从项目中读取RenderingReference,并将它们放入页面中。这使得灵活,可扩展的系统允许您处理不同类型产品的不同输出。
这与您描述的解决方案(每种产品类型的Sublayout)接近,但允许子布局为数据驱动,而不是每个TemplateID的条件逻辑。 (注意,您还需要在演示文稿详细信息中指定一个虚拟的“主要布局”。)