2013-03-21 3 views
0

Я пытаюсь внедрить технику Dynamic Place Holder Ника Вессельмана в Sitecore. Я использую sitecore 6.5 и asp.net.Switcher <Placeholder, PlaceholderSwitcher> .GetStack возвращает null Как реализовать динамические заполнители в sitecore

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

Все трубопроводы кажутся на месте и работает. Но в Dynamic Закончен Место контролировать следующий бит кода возвращает значение 0 (ноль), хотя существует пять динамических заполнители по контролю

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

изолировать проблему, я создал очень простой Sitecore экземпляр. 1 макет и 1 подвал.

В отделенной коде sublayout У меня есть следующий код для демонстрационных целей:

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> 

Результата является то, что все пять заполнителей до сих пор имеют те же ключ.

Что делать?

ответ

1

Я никогда не тестировал это решение с помощью нескольких динамически созданных элементов управления заполнителями внутри одного и того же подзаголовка. Он предназначен для решения проблемы одного и того же подзаголовка (с помощью заполнителя), размещаемого на странице, несколько раз. Он работает, захватывая идентификатор содержащего рендеринга и добавляя его к ключу-заполнителю. Шаги, которые я бы взял:

  • Убедитесь, что подъярус, содержащий ваш ретранслятор, динамически помещается в макет через заполнитель. Вы не должны использовать <sc:Sublayout/>, чтобы поместить подзаголовок на страницу. Это может объяснить, почему стек пуст.
  • Вам также понадобится привязать поле «Ключ» на DynamicKeyPlaceholder. В пределах одного и того же подблока все элементы управления DynamicKeyPlaceholder должны иметь уникальный ключ.

Конечно, опасность в том, что если данные, приводящие ваш ретранслятор, меняются, ключ может измениться. Вы можете подумать о переоценке своей архитектуры и ее вождении на основе многократного размещения одного и того же подзадача (с источниками данных) вместо ретранслятора.

+0

Так вы, где правильно. Мне пришлось изменить свой дизайн. Дело в том, что динамический placeholder actualy должен быть добавлен к содержащему placehoder через Редактор страниц. Сохраняя это, держатель dynamicplace будет сохранен в базе данных. Только тогда Stack stack = Switcher .GetStack (false); сможет получить стек. Таким образом, в коде динамическое добавление заполнителей не будет работать, потому что они не будут сохранены в sitecore. Было сложно изменить мой дизайн и не потерять функциональность в моем приложении. Но теперь все работает как ветер. Спасибо за вашу помощь. –

+0

Прохладный вы можете опубликовать или принять свой ответ или принять мой? Спасибо, Пол. – techphoria414

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; 

Надеется, что это помогает !

+0

Спасибо. Я уже исправил проблему в первоначальном порядке. Но это может сработать. –

+0

Не проблема! Рад, что я могу помочь. – Coder

Смежные вопросы