【问题标题】:Switcher<Placeholder, PlaceholderSwitcher>.GetStack returns null How to implement dynamic placeholders in sitecoreSwitcher<Placeholder, PlaceholderSwitcher>.GetStack 返回 null 如何在 sitecore 中实现动态占位符
【发布时间】:2013-03-21 15:50:59
【问题描述】:

我正在尝试在 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 个子布局。

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

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>

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

怎么办?

【问题讨论】:

    标签: asp.net sitecore sitecore6


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以你是对的。我不得不改变我的设计。问题是动态占位符实际上必须通过页面编辑器添加到包含占位符。通过保存这个,动态占位符将被保存到数据库中。只有 Stack stack = Switcher.GetStack(false);将能够获得堆栈。因此,在代码中动态添加占位符将不起作用,因为它们不会被 sitecore 保存。在我的应用程序中改变我的设计并且不丢失功能是很棘手的。但现在一切都变得轻而易举。感谢您的帮助。
    • 很酷,您可以发布并接受您自己的答案,还是接受我的?谢谢保罗。
    【解决方案2】:

    我所做的与您的要求相似...我从调用控件(希望具有动态 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;
    

    希望这有帮助

    【讨论】:

    • 谢谢。我已经以最初的方式解决了这个问题。但这也可以。
    • 没问题!很高兴我能提供任何帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多