12

特定のプレースホルダー内に存在するレンダリングのコンテンツ (HTML など) を出力するメソッドを作成しようとしています。目標は、Sitecore.Data.Items.Item興味のあるプレースホルダー キーを渡すことであり、メソッドはレンダリングされたコンテンツを返す必要があります。

これに関する問題は、ページ コンテキストが確立されていないため、サブレイアウトのメソッドでRenderControl()null 参照エラーをスローしているようです。GetCacheKey()

サブレイアウトまたは XSLT レンダリングをプログラムでレンダリングする方法を知っている人はいますか?

ここに私がこれまでに持っているものがあります:

private string GetPlaceholderContent(Item item, string placeHolder)
{
    StringWriter sw = new StringWriter();
    using (HtmlTextWriter writer = new HtmlTextWriter(sw))
    {
        foreach (RenderingReference renderingReference in item.Visualization.GetRenderings(Sitecore.Context.Device, false))
        {
            if (renderingReference.Placeholder == placeHolder)
            {
                // This ensures we're only dealing with Sublayouts
                if (renderingReference.RenderingItem.InnerItem.IsOfType(Sitecore.TemplateIDs.Sublayout))
                {
                    var control = renderingReference.GetControl();
                    control.RenderControl(writer); // Throws null reference error in GetCacheKey()
                }
            }
        }
    }

    return sw.ToString();
}
4

2 に答える 2

0

私の意見では、サブレイアウトをプログラムでレンダリングする最良の方法は、リピーターを使用<sc:Sublayout>し、<ItemTemplate>.

そこから、次のいずれかまたは両方を実行するだけです。

  1. DataSourceのプロパティを<sc:Sublayout>、目的の項目の GUID (つまり、サブレイアウトのデータ ソースがある場合) の文字列表現に設定します。

  2. Pathのプロパティを、<sc:Sublayout>レンダリングするサブレイアウトへのパスに設定します。

サーバー/サイトコアが残りを処理します。

于 2013-04-11T14:30:45.857 に答える