3

InnerPropertyであるPlaceHolderを持つサーバーコントロールがあります。クラスでレンダリングするときに、PlaceHolderにあるはずのテキスト/HTMLコンテンツを取得する必要があります。フロントエンドコードの例を次に示します。

<tagPrefix:TagName runat="server">
    <PlaceHolderName>
      Here is some sample text!
    </PlaceHolderName>
</tagPrefix:TagName>

コンテンツを取得する方法がわからない場合を除いて、これはすべて正常に機能します。PlaceHolderクラスによって公開されたレンダリングメソッドが表示されません。サーバーコントロールのコードは次のとおりです。

public class TagName : CompositeControl
{
    [TemplateContainer(typeof(PlaceHolder))]
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public PlaceHolder PlaceHolderName { get; set; }

    protected override void RenderContents(HtmlTextWriter writer)
    {
       // i want to retrieve the contents of the place holder here to 
       // send the output of the custom control.
    }        
}

何か案は?前もって感謝します。

4

2 に答える 2

4

私はちょうど解決策を見つけました。PlaceHolderオブジェクトをどのように使用していたかというコンテキストのため、renderメソッドが表示されませんでした。たとえば、私はそれを値として使用し、次のように文字列に割り当てようとしていました:

string s = this.PlaceHolderName...

イコールの右側にあるため、Intellisenseはrenderメソッドを表示しませんでした。とHtmlTextWriterを使用してPlaceHolderをレンダリングする方法は次のとおりです。

   StringWriter sw = new StringWriter();
   HtmlTextWriter htw = new HtmlTextWriter(sw);
   this.PlaceHolderName.RenderControl(htw);
   string s = sw.ToString();
于 2010-12-23T16:55:45.640 に答える
1

コードフォーマットを使用できるように、これを2番目の回答として投稿します。これは、ジェネリックスを使用し、「using」機能を使用してテキスト/htmlライターを自動的に破棄する更新されたメソッドです。

    private static string RenderControl<T>(T c) where T : Control, new()
    {
        // get the text for the control
        using (StringWriter sw = new StringWriter())
        using (HtmlTextWriter htw = new HtmlTextWriter(sw))
        {
            c.RenderControl(htw);
            return sw.ToString();
        }
    }
于 2010-12-23T18:06:15.587 に答える