也许我说这一切都错了(请告诉我,如果我的话),但我正在用一个看起来非常简单的概念的方式撞墙。
此渲染覆盖来自用户控件。
protected override void Render(HtmlTextWriter writer)
{
string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar();
// Do something nefarious, yet unrelated with htmlAboutToBeRendered
}
这似乎有一种明显的方法可以做到这一点,但我似乎无法找到它。
有人可以为我解释一下吗?
答案 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获取的一些线索构建的