2009-06-17 14 views
11

Być może podchodzę do tego wszystkiego źle (i proszę powiedz mi, jeśli jestem), ale uderzam głową o ścianę czymś, co wydaje się być naprawdę prostą koncepcją.HtmlTextWriter to String - Czy coś przeoczyłem?

To nadpisanie renderingu pochodzi z Kontroli użytkownika.

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

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered 
} 

To wydaje się być oczywistym sposobem, aby to zrobić, ale nie mogę tego znaleźć.

Czy ktoś może rzucić trochę światła na to dla mnie, proszę?

Odpowiedz

20

Spróbuj tego:

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

}

+0

+1 to jest jeden! Dzięki za pomoc! –

+1

Właśnie po to, aby kontynuować - otworzyłem Reflector i odkryłem, że metoda Render po prostu wywołuje Recusively RenderChildren dla każdej kontrolki w drzewie pod kontrolą użytkownika. To oznacza, że ​​byłeś na miejscu. Dzięki jeszcze raz! –

1

Alternatywna metoda z użyciem 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(); 
} 

to jest to prosta sprawa ponownego tworzenia HtmlTextWriter stosując string i StringBuilder.

ta została zbudowana w oparciu o kilka wskazówek, wybrałem się z conversation between Tom Spink and Rotsey na EggheadCafe

+2

Fuj! To nie jest miłe ... – tomfanning

+0

Uzgodnione z @tomfanning, nie widzę żadnego punktu w użyciu refleksji tutaj. –

Powiązane problemy