0

Sitecore で Nick Wesselman の Dynamic Place Holder テクニックを実装しようとしています。サイトコア 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 で見つけたソースコードを使用しました

すべてのパイプラインが適切に機能しているようです。ただし、動的プレースホルダー コントロールでは、コントロールに 5 つの動的プレースホルダーがあるにもかかわらず、次のコード ビットは 0 (ゼロ) を返します。

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

問題を特定するために、非常に単純なサイトコア インスタンスを作成しました。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>

その結果、5 つのプレースホルダーすべてが同じキーを保持しています。

何をすべきか?

4

2 に答える 2

1

同じサブレイアウト内に動的に作成された複数のプレースホルダー コントロールを使用して、このソリューションをテストしたことはありません。同じサブレイアウト (プレースホルダーを含む) がページに複数回配置されるという問題を解決するように設計されています。これは、含まれているレンダリングの ID を取得し、それをプレースホルダー キーに追加することによって機能します。私が取るステップ:

  • リピーターを含むサブレイアウトが、プレースホルダーを介して動的にレイアウトに配置されていることを確認してください。サブレイアウトをページに配置するために使用<sc:Sublayout/>しないでください。これは、スタックが空である理由を説明している可能性があります。
  • の「キー」フィールドをデータバインドする必要もありますDynamicKeyPlaceholder。同じサブレイアウト内では、すべてのDynamicKeyPlaceholderコントロールに一意のキーが必要です。

もちろん、ここでの危険は、リピーターを駆動するデータが変更されると、キーが変更される可能性があることです。リピーターの代わりに、同じサブレイアウトを (データソースを使用して) 複数回配置することに基づいて、アーキテクチャを再評価し、駆動することを検討してください。

于 2013-03-21T17:22:25.377 に答える
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;

これが役立つことを願っています!

于 2013-03-25T14:16:12.813 に答える