Perhaps I’m going about this all wrong (and please tell me if I am), but I’m hitting my head against a wall with something that seems like a really simple concept.
This Render override is coming from a User Control.
protected override void Render(HtmlTextWriter writer)
{
string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar();
// Do something nefarious, yet unrelated with htmlAboutToBeRendered
}
This seems like a there would be an obvious way to do this, but I can’t seem to find it.
Can anyone shed some light on this for me, please?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Try this:
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();
}
Method 2
You can derive from HttpTextWriter and override OnTagRender, OnAttributeRender and OnStyleRender methods and modify the tags as they are rendered. The MSDN docs for OnTagRender show a sample where the tag is modified during rendering:
http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.ontagrender.aspx
Method 3
Alternate method using 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();
}
Then it’s a simple matter of re-creating the HtmlTextWriter using the string and a StringBuilder.
This was built using a couple clues I picked up from a conversation between Tom Spink and Rotsey on EggheadCafe
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0