HtmlTextWriter到String - 我忽略了什么吗?

时间:2009-06-17 17:44:28

标签: c# asp.net

也许我说这一切都错了(请告诉我,如果我的话),但我正在用一个看起来非常简单的概念的方式撞墙。

此渲染覆盖来自用户控件。

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

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered
}

这似乎有一种明显的方法可以做到这一点,但我似乎无法找到它。

有人可以为我解释一下吗?

3 个答案:

答案 0 :(得分:22)

试试这个:

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

}

答案 1 :(得分:3)

您可以从HttpTextWriter派生并覆盖OnTagRender,OnAttributeRender和OnStyleRender方法,并在呈现时修改标记。 OnTagRender的MSDN文档显示了在呈现期间修改标记的示例:

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

答案 2 :(得分:1)

使用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();
}

然后,使用字符串和StringBuilder重新创建HtmlTextWriter是一件简单的事。

这是使用我从EggheadCafe的conversation between Tom Spink and Rotsey获取的一些线索构建的