在页面编辑器中找不到Sitecore占位符键

本文关键字:Sitecore 占位符 找不到 编辑器 | 更新日期: 2023-09-27 17:50:39

我在Sitecore 6.6的一个子布局中有一个中继器。120918年牧师。在这个重复器中,我有一个占位符。在ItemDataBound上,我为它分配了一个带有GUID的键,并使用Nick Wesselman的GetAllowedRendering管道,我能够为此呈现插入选项。

中继器代码非常简单:

<asp:Repeater runat="server" ID="rptrTimelineItemsEdit"  OnItemDataBound="rptrTimelineItemsEdit_OnItemDataBound">
  <ItemTemplate>
    <sc:Placeholder ID="scTimelineItemPlaceholder" Key="timelineitemcontent" runat="server" />
  </ItemTemplate>
</asp:Repeater>

项目数据绑定也很简单:

protected void rptrTimelineItemsEdit_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    Item item = (Item)e.Item.DataItem;
    Placeholder scTimelineItemPlaceholder = (Placeholder)e.Item.FindControl("scTimelineItemPlaceholder");
                scTimelineItemPlaceholder.Key = "timelineitemcontent" + item.ID.ToString().ToLower(); 
  }
}

到目前为止一切都很顺利。在我选择我想要插入占位符的子布局后,它会在JS错误弹出框中抛出我。在chrome检查器中检查后,我看到错误是:

Could not find the rendering in the HTML loaded from server PlaceholderChromeType.js:601
Sitecore.PageModes.ChromeTypes.Placeholder.Sitecore.PageModes.ChromeTypes.ChromeType.extend._frameLoaded

所以-它似乎在页面重新加载,子布局呈现发生在中继器绑定之前,所以它找不到占位符键。

我做了一些谷歌,发现有一种方法来改变使用layoutpageevent设置布局引擎序列:

然而,这并没有解决我的问题。我没主意了。的帮助!

在页面编辑器中找不到Sitecore占位符键

你好,我找到了一个解决这个问题的方法,它也把我难住了。它只发生在位于重复器下面的占位符上。覆盖PlaceholderChromeType.js在Website'sitecore'shell'Applications'Page Modes'ChromeTypes'用我放进盒子里的那个(也可以在下面的信用链接上找到)https://www.dropbox.com/s/7m99b8jgdz3cgl2/PlaceholderChromeType。你的钥匙必须要有动力才能工作。示例代码:

protected void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
    {
        var p = e.Item.FindControl("andysplaceholder") as Placeholder;
        p.ID = "Andy" + (e.Item.ItemIndex + 1);
        p.Key = "dynamic" + p.ID;
    }
<asp:repeater id="MyRepeater" runat="server" OnItemDataBound="R1_ItemDataBound">
        <ItemTemplate>        
               <sc:placeholder runat="server" id="andysplaceholder" key="dynamicandysplaceholder" ></sc:placeholder>
        </ItemTemplate>
    </asp:repeater>

在此之上,我在oninit方法中绑定了我的重复器

 protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

和我设置的网页。从preInit到load的配置设置

<setting name="LayoutPageEvent" value="load" />

虽然这可能有点小题大做,但今天我将恢复page_load和preinit,看看它是否仍然有效。

归功于Sitecore支持和Mickey Rahman http://mickeyrahman.wordpress.com/2014/05/05/an-ode-to-sitecore-support/#respond

这应该也适用于Nick的动态键方法,您只需要确保由他的代码生成的键具有动态

您没有按照Nick解释的方式实现它。
你需要做的是为你的动态占位符创建一个WebControl类。这将确保事情按照与'真正的'占位符相同的顺序处理。

所以我要做的第一件事就是确保你按照Nick描述的方式去做。
然后验证它在页面上仅与一个动态占位符一起工作。

其次,你应该看看这篇博客文章:动态占位符和可扩展
它解释了如何在中继器(和其他控件)中添加多个动态占位符。
他还认为这与LayoutPageEvent的变化有关,但事实并非如此。

编辑:


我已经重复了这个问题,我非常怀疑你会用这种方法解决它。
当页面编辑器在尝试向占位符添加控件后请求其呈现时,尚未加载占位符。
即使你在OnInit中创建占位符(这是最早的),它也不起作用。

如果我有更多的时间,我会进一步研究的。

Ruud在他的回答中引用了我的博客文章动态占位符和IExpandable,我认为他绝对是在正确的轨道上。我知道你还没有像我描述的那样使用动态占位符,但是你仍然在动态创建占位符。

我个人从未在LayoutPageEvent上取得过任何成功;这就是为什么我决定发布关于IExpandable的使用,因为它不是那么突出的东西。

您应该在Expand方法中创建占位符,并在将它们添加到页面后展开它们。我个人建议不要使用Repeater来这样做-将它们添加到控件集合或可能添加到正常的ASP中。Net PlaceHolder控制。

public class YourSublayout : UserControl, IExpandable
{
    public void Expand()
    {
        var myListOfItems = GetItems()
        foreach (var item in myListOfItems)
        {
            var placeholder = new Placeholder { Key = "key" + item.ID.ToString() };
            container.Controls.Add(placeholder); // add to a control container
            placeholder.Expand();
        }
    }
}

希望这能让你更进一步(如果你还没有解决它)。请记住我在我的帖子中提到的其他事情,即Expand方法可以在控件添加到页面之前调用,因此如果您依赖于从父控件获取数据源,则可能会中断。