2013-03-06 7 views
10

特定のプレースホルダ内に存在するレンダリングのコンテンツ(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(); 
} 
+0

このコードをSitecoreアプリケーション内で実行していますか?コンテキストがあることを期待しているのですか、それとも別のアプリケーションであり、手動でコンテキストを作成する方法が必要ですか? –

+0

まあ...もちろん、それを行う方法があります...内部的にはこれがSitecoreがやっていることです。私は、ILSpyまたはReflectorで集中的に探検することをお勧めします。あなたのspelunkingヘルメットを入れ、のrenderLayoutセクションをチェックしてください。 – Bryan

+0

オプションは、プレースホルダマークアップの周りにマーカーをいくつか追加し、コードからアイテムへのリクエストを実行してから、興味のあるhtmlの部分だけを取得するように応答をトリミングすることでしょうか? –

答えて

1

を、プログラム的Sublayoutをレンダリングするための最良の方法は、リピータを使用し、<ItemTemplate><sc:Sublayout>タグを置くことです。あなたが唯一の次のいずれかまたは両方を行う必要があります。そこから

<sc:Sublayout>DataSourceプロパティはsublayoutため、目的の項目のGUID(すなわち、データ・ソースの文字列表現になるように設定
  1. 、存在する場合)

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

残りの部分はサーバー/サイトコードで処理されます。

+2

これは、静的にサブレイアウトをコードに挿入しています。 DerekはC#でコントロールをプログラムでレンダリングし、C#でそのコントロールの応答出力文字列を取得する必要があります。彼はサービスのページコンテキストがありません。 –

関連する問題