Asp.net 切换器<;占位符,占位符切换器>;。GetStack返回null如何在sitecore中实现动态占位符

Asp.net 切换器<;占位符,占位符切换器>;。GetStack返回null如何在sitecore中实现动态占位符,asp.net,sitecore,sitecore6,Asp.net,Sitecore,Sitecore6,我试图在Sitecore中实现Nick Wesselman的动态占位符技术。我正在使用sitecore 6.5和asp.net 我使用了在Sitecore\u页面\u编辑器\u发布的博客中找到的源代码 所有的管道似乎都已就位并正常工作。但是在动态占位符控件中,下面的代码位返回0(零),尽管该控件上有五个动态占位符 Stack<Placeholder> stack = Switcher<Placeholder, PlaceholderSwitcher>.GetStack

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

我使用了在Sitecore\u页面\u编辑器\u发布的博客中找到的源代码

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

Stack<Placeholder> stack = Switcher<Placeholder, PlaceholderSwitcher>.GetStack(false);
Stack-Stack=Switcher.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();
var list=newlist();
对于(int i=0;i<5;i++)
{
列表.添加(i);
}
Repeater.DataSource=列表;
数据绑定();
这是ascx/子布局的来源

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

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


怎么办?

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

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

当然,这里的危险在于,如果驱动中继器的数据发生变化,则钥匙可能会发生变化。您可能会考虑重新评估体系结构并基于相同的子窗体多次(使用DATA)来驱动它,而不是一个中继器。

我所做的与您所请求的类似……我创建了另一个从调用控件实现的子空间(它实现动态占位符)的引用。(希望具有动态ph值)

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

这是ControlA的标记:

 <ControlB ID="SectionItems" runat="server" CurrentItem="<%# Container.DataItem %>" />
当您指定属性名称(将出现在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;

希望这有帮助!

所以你说得对。我不得不改变我的设计。问题是,动态占位符实际上必须通过页面编辑器添加到包含的placehoder中。通过保存此占位符,动态占位符将保存到数据库中。只有这样,Stack Stack=Switcher.GetStack(false);将能够获得堆栈。因此,在代码中动态添加占位符将不起作用,因为它们不会被sitecore保存。更改我的设计和我的应用程序中不松散的功能很棘手。但现在一切都很轻松。感谢您的帮助。很酷,您可以发布并接受您自己的答案,还是接受我的答案?谢谢Paul。Th谢谢。我已经用最初的方法解决了这个问题。但是这也可以。没问题!很高兴我能帮上忙。
 private void SetPlaceholderKeys(RepeaterItemEventArgs e)
    {
        Placeholder phPreColumnContentTopLeft = e.Item.FindControl("phColumnContentTopLeft") as Placeholder;
        if (phPreColumnContentTopLeft != null)
            phPreColumnContentTopLeft.Key = "topLeftColumnSectionItems" + e.Item.ItemIndex + PropertyName;