HtmlTextWriter to String - Я что-то пропускаю?
Возможно, я все это сделаю неправильно (и, пожалуйста, скажите мне, есть ли у меня), но я ударяю головой о стену с чем-то вроде действительно простой концепции.
Это переопределение рендера происходит из пользовательского элемента управления.
protected override void Render(HtmlTextWriter writer)
{
string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar();
// Do something nefarious, yet unrelated with htmlAboutToBeRendered
}
Кажется, что это будет очевидный способ сделать это, но я не могу найти его.
Может ли кто-нибудь пролить свет на это для меня, пожалуйста?
Ответы
Ответ 1
Попробуйте следующее:
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();
}
Ответ 2
Вы можете получить HttpTextWriter и переопределить методы OnTagRender, OnAttributeRender и OnStyleRender и изменить теги по мере их рендеринга. Документы MSDN для OnTagRender показывают образец, в котором тег изменен во время рендеринга:
http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.ontagrender.aspx
Ответ 3
Альтернативный метод с использованием функции 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