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

也许我说这一切都错了(请告诉我,如果我的话),但是我正在用一些似乎是一个非常简单的概念的东西撞墙。

此Render覆盖来自用户控件。

protected override void Render(HtmlTextWriter writer) { string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar(); // Do something nefarious, yet unrelated with htmlAboutToBeRendered } 

这似乎是一种显而易见的方法,但我似乎无法找到它。

有谁可以为我解释这个,拜托?

试试这个:

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

}

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

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

使用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是一件简单的事情。

这是使用我在Tomhead Spink和EggheadCafe上的Rotsey 之间的对话中找到的一些线索构建的