Получение содержимого ASP.NET System.Web.UI.WebControls.PlaceHolder - PullRequest
3 голосов
/ 23 декабря 2010

У меня есть серверный элемент управления с PlaceHolder, который является InnerProperty.В классе при рендеринге мне нужно получить текстовый / HTML контент, который должен быть в PlaceHolder.Вот пример того, как выглядит интерфейсный код:

<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.
    }        
}

Есть идеи?Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2010

Я только что нашел решение.Я не видел методы рендеринга из-за контекста того, как я использовал объект PlaceHolder.Например, я пытался использовать его в качестве значения и присвоить его строке, например, так:

string s = this.PlaceHolderName...

Поскольку он был справа от равенства, Intellisense не показывал мне методы визуализации.Вот как вы отображаете PlaceHolder с помощью HtmlTextWriter:

   StringWriter sw = new StringWriter();
   HtmlTextWriter htw = new HtmlTextWriter(sw);
   this.PlaceHolderName.RenderControl(htw);
   string s = sw.ToString();
1 голос
/ 23 декабря 2010

Отправив это как второй ответ, чтобы я мог использовать форматирование кода.Вот обновленный метод, который использует Generics, а также функцию «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();
        }
    }
...