在页面编辑器中找不到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
设置布局引擎序列:
然而,这并没有解决我的问题。我没主意了。的帮助!
你好,我找到了一个解决这个问题的方法,它也把我难住了。它只发生在位于重复器下面的占位符上。覆盖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
方法可以在控件添加到页面之前调用,因此如果您依赖于从父控件获取数据源,则可能会中断。