【问题标题】:HtmlTextWriter to String - Am I overlooking something?HtmlTextWriter to String - 我忽略了什么吗?
【发布时间】:2009-06-18 02:33:03
【问题描述】:

也许我在处理这一切都错了(如果我错了,请告诉我),但我正在用一个看似非常简单的概念的东西撞到墙上。

此渲染覆盖来自用户控件。

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

    // Do something nefarious, yet unrelated with htmlAboutToBeRendered
}

这似乎有一种明显的方法可以做到这一点,但我似乎找不到它。

谁能帮我解释一下?

【问题讨论】:

    标签: c# asp.net


    【解决方案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();  
    

    }

    【讨论】:

    • 只是跟进 - 我打开了反射器,发现 Render 方法只是为用户控件下的树中的每个控件重复调用 RenderChildren。这意味着您对此非常了解。再次感谢!
    【解决方案2】:

    您可以从 HttpTextWriter 派生并覆盖 OnTagRender、OnAttributeRender 和 OnStyleRender 方法,并在呈现标签时修改它们。 OnTagRender 的 MSDN 文档显示了在渲染期间修改标记的示例:

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

      然后使用字符串和 StringBuilder 重新创建 HtmlTextWriter 就很简单了。

      这是使用我从 Egg​​headCafe 上的 conversation between Tom Spink and Rotsey 获得的一些线索构建的

      【讨论】:

      • 同意@tomfanning,我认为在这里使用反射没有任何意义。
      猜你喜欢
      • 2017-08-12
      • 2013-09-30
      • 2011-03-27
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多