2009-06-17 56 views
11

也許我正在談論這一切都是錯誤的(請告訴我,如果我是),但我正在用一種看起來像一個非常簡單的概念我的頭靠牆。HtmlTextWriter to String - 我可以忽略一些東西嗎?

此渲染覆蓋來自用戶控件。

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

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered 
} 

這似乎是一個會有這樣做一個顯而易見的方式,但我似乎無法找到它。

任何人都可以在這裏爲我介紹一些情況嗎?

回答

20

試試這個:

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那是一個拿起建成!謝謝您的幫助! – 2009-06-17 18:19:00

+1

只是後續 - 我彈出打開反射器,發現Render方法只是recusively調用RenderChildren爲用戶控制下的樹中的每個控件。這意味着你對此有所瞭解。再次感謝! – 2009-06-17 20:39:58

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

然後,它使用重新創建的HtmlTextWriter一個簡單的事情字符串和一個StringBuilder。

這是用一對夫婦的線索,我從一個conversation between Tom Spink and Rotsey上EggheadCafe

相關問題