代码之家  ›  专栏  ›  技术社区  ›  Adam McKee

HTML文本编写器到字符串-我是否忽略了某些内容?

  •  12
  • Adam McKee  · 技术社区  · 15 年前

    也许我这一切都是错的(如果是的话请告诉我),但我的头撞在墙上的东西似乎是一个非常简单的概念。

    此呈现覆盖来自用户控件。

    protected override void Render(HtmlTextWriter writer)
    {
        string htmlAboutToBeRendered = writer.GetWhatHasBeenWrittenToTheWriterSoFar();
    
        // Do something nefarious, yet unrelated with htmlAboutToBeRendered
    }
    

    这似乎是一个显而易见的方法,但我似乎找不到它。

    有人能帮我解释一下吗?

    3 回复  |  直到 15 年前
        1
  •  22
  •   TheTXI    15 年前

    试试这个:

    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
  •  3
  •   Robert Horvick    15 年前

    您可以从httptextwriter派生并重写ontagrender、onAttributerender和onStyleRender方法,并在呈现时修改标记。OnTagrender的msdn docs显示了一个示例,其中在呈现期间修改了标记:

    http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.ontagrender.aspx

        3
  •  1
  •   Mark    15 年前

    使用再感染的替代方法:

    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是一件简单的事情。

    这是我从一个 conversation between Tom Spink and Rotsey 艾格达咖啡馆