HtmlTextWriter to String - Я что-то пропускаю?

Возможно, я все это сделаю неправильно (и, пожалуйста, скажите мне, есть ли у меня), но я ударяю головой о стену с чем-то вроде действительно простой концепции.

Это переопределение рендера происходит из пользовательского элемента управления.

protected override void Render(HtmlTextWriter writer)
{
    string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar();

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered
}

Кажется, что это будет очевидный способ сделать это, но я не могу найти его.

Может ли кто-нибудь пролить свет на это для меня, пожалуйста?

Ответ 1

Попробуйте следующее:

protected override void RenderContents(HtmlTextWriter output)  
{  
   StringBuilder sb = new StringBuilder();  
   HtmlTextWriter htw = new HtmlTextWriter(new System.IO.StringWriter(sb,   
   System.Globalization.CultureInfo.InvariantCulture));  
   foreach (Control ctrl in Controls)  
   {  
      ctrl.RenderControl(htw);  
   }  
  string strContents = sb.ToString();  

}

Ответ 2

Вы можете получить HttpTextWriter и переопределить методы OnTagRender, OnAttributeRender и OnStyleRender и изменить теги по мере их рендеринга. Документы MSDN для OnTagRender показывают образец, в котором тег изменен во время рендеринга:

http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.ontagrender.aspx

Ответ 3

Альтернативный метод с использованием функции relfection:

private string GetString(HtmlTextWriter writer) 
{
   // the flags to see the internal properties of the writer
   System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Default;
   flags |= System.Reflection.BindingFlags.NonPublic;
   flags |= System.Reflection.BindingFlags.Instance;
   flags |= System.Reflection.BindingFlags.FlattenHierarchy;
   flags |= System.Reflection.BindingFlags.Public;

   // get the information about the internal TextWriter object
   System.Reflection.FieldInfo baseWriter = writer.GetType().GetField("writer", flags);

   // use that info to create a StringWriter
   System.IO.StringWriter reflectedWriter = (System.IO.StringWriter)baseWriter.GetValue(writer);

   // now we get a StringBuilder!
   StringBuilder builder = reflectedWriter.GetStringBuilder();

   return builder.ToString();
}

Тогда это просто вопрос воссоздания HtmlTextWriter с использованием строки и StringBuilder.

Это было построено с помощью пары подсказок, которые я взял из беседы между Томом Спинком и Ротси на EggheadCafe