Switcher <placeholder,placeholderswitcher =“”> .GetStack返回null如何在sitecore中实现动态占位符</placeholder,>

时间:2013-03-21 15:50:59

标签: asp.net sitecore sitecore6

我正在尝试在Sitecore中实施Nick Wesselman的动态占位符技术。我正在使用sitecore 6.5和asp.net。

http://www.techphoria414.com/Blog/2011/August/Dynamic_Placeholder_Keys_Prototype http://www.techphoria414.com/Blog/2012/May/Sitecore_Page_Editor_Unleashed

我使用了Sitecore_Page_Editor_Unleashed BLOG中找到的源代码

所有管道似乎都已就位并正常工作。但是在动态占位符控件中,虽然控件上有五个动态占位符,但下面的代码返回0(零)

Stack<Placeholder> stack = Switcher<Placeholder, PlaceholderSwitcher>.GetStack(false);

为了隔离问题,我创建了一个非常简单的sitecore实例。 1个布局和1个子布局。

在codebehind子布局中,我有以下代码用于演示目的:

var list = new List<int>();
for (int i = 0; i < 5; i++)
{
    list.Add(i);
}

Repeater.DataSource = list;
DataBind();

这是ascx / sublayout

的来源
<asp:Repeater runat="server" ID="Repeater">
     <ItemTemplate>
       <mi:DynamicKeyPlaceholder runat="server"  ID="pl" Key="place"></mi:DynamicKeyPlaceholder> 
    </ItemTemplate>
</asp:Repeater>

结果是所有五个占位符仍具有相同的密钥。

怎么办?

2 个答案:

答案 0 :(得分:1)

我从未在同一子布局中使用多个动态创建的占位符控件来测试此解决方案。它旨在解决相同的子布局(带有占位符)多次放置在页面上的问题。它的工作原理是获取包含渲染的ID并将其附加到占位符键。我会采取的步骤:

  • 确保包含转发器的子布局通过占位符动态放置在布局中。您不应该使用<sc:Sublayout/>将子布局放在页面上。这可以解释为什么堆栈是空的。
  • 您还需要对DynamicKeyPlaceholder上的“密钥”字段进行数据绑定。在同一子布局中,所有DynamicKeyPlaceholder控件都需要具有唯一的键。

当然,这里存在的危险是,如果驱动转发器的数据发生变化,则密钥可能会发生变化。您可以考虑重新评估您的体系结构并基于多次放置相同的子布局(使用数据源)而不是转发器来驱动它。

答案 1 :(得分:0)

我所做的与您要求的相似...我从调用控件(想要具有动态ph)创建了另一个子布局(实现动态占位符)的引用。

假设我的调用控件是ControlA,实现控件是ControlB。

这是ControlA的标记

 <ControlB ID="SectionItems" runat="server" CurrentItem="<%# Container.DataItem %>" />

这是它背后的代码

 private static void SetIndexForControlBItems(RepeaterItemEventArgs e)
   {
       var controlBItems = e.Item.FindControl("ControlB") as ControlB;
       if (controlBItems != null)
          controlBItems.PropertyName = e.Item.ItemIndex.ToString();
   }

当您指定属性名称(将出现在ControlB中)时,您将获得要为其分配动态PH的索引的值。在 ControlB 中,您可以执行以下操作:

 private void SetPlaceholderKeys(RepeaterItemEventArgs e)
    {
        Placeholder phPreColumnContentTopLeft = e.Item.FindControl("phColumnContentTopLeft") as Placeholder;
        if (phPreColumnContentTopLeft != null)
            phPreColumnContentTopLeft.Key = "topLeftColumnSectionItems" + e.Item.ItemIndex + PropertyName;

希望帮助