HtmlTextWriter to String - Я что-то пропускаю? - PullRequest
13 голосов
/ 17 июня 2009

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

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

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

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered
}

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

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

Ответы [ 3 ]

22 голосов
/ 17 июня 2009

Попробуйте это:

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();  

}

3 голосов
/ 17 июня 2009

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

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

1 голос
/ 17 июня 2009

Альтернативный метод с использованием 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...