特定のプレースホルダ内に存在するレンダリングのコンテンツ(HTMLなど)を出力するメソッドを作成しようとしています。目的は、Sitecore.Data.Items.Item
と私が興味を持っているプレースホルダーキーを渡すことです、そして、メソッドはレンダリングされた内容を返すべきです。プログラムのレンダリングの内容を取得する方法は?
この問題は、ページコンテキストが確立されていないため、RenderControl()
を呼び出すと、SublayoutのGetCacheKey()
メソッドでnull参照エラーが発生しているようです。
Sublayoutまたは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();
}
このコードをSitecoreアプリケーション内で実行していますか?コンテキストがあることを期待しているのですか、それとも別のアプリケーションであり、手動でコンテキストを作成する方法が必要ですか? –
まあ...もちろん、それを行う方法があります...内部的にはこれがSitecoreがやっていることです。私は、ILSpyまたはReflectorで集中的に探検することをお勧めします。あなたのspelunkingヘルメットを入れ、のrenderLayoutセクションをチェックしてください。 –
Bryan
オプションは、プレースホルダマークアップの周りにマーカーをいくつか追加し、コードからアイテムへのリクエストを実行してから、興味のあるhtmlの部分だけを取得するように応答をトリミングすることでしょうか? –