在它离开代码隐藏之前改变html

时间:2012-07-21 03:41:07

标签: c# vb.net html-agility-pack

在vb.net或C#网站

如何在离开服务器之前访问最终的html,以便我可以从代码隐藏中进行最终的html调整。(我不想使用JavaScript来进行这些调整)

是否会是最后一个触发事件的页面PreRenderComplete事件,我将能够看到发送到浏览器的html,我将能够使用HtmlAgilityPack编辑html?

这一定很容易做到并且可能

由于

3 个答案:

答案 0 :(得分:1)

修改已经写好的HTML至少不是微不足道的(如果不是不可能的话)。响应被写入输出流,可能已经部分发送给客户端。

如果您使用WebForms,操作控件树并在呈现之前插入元素会更容易(PreRenderComplete听起来很正常)。

答案 1 :(得分:1)

您可以覆盖Page_Render并轻松拦截输出流。这样做没有风险。在任何Page中:

 protected override void Render(System.Web.UI.HtmlTextWriter writer)         
 {
      // intercept the output stream and write to your own 
      // StringWriter, bound to a StringBuilder

      var sb = new StringBuilder();
      var sw = new StringWriter(sb);
      base.Render(sw);

      string html = sb.ToString();

      // do stuff to alter "html"

      ..

      // write it to the real output stream

      writer.Write(html)
 }

如果您正在使用UpdatePanels(异步回发),它可能会有点毛茸茸,因为HTML是以特殊方式格式化的。即使在那里,它也不是不可能改变的,但它需要更多的工作,因为UpdatePanel数据块实际上是校验和。 (幸运的是,这是一个非常简单的,只是内容的长度)。但不仅仅是改变内容并将其写回来那么简单。

但对于非异步回发,它看起来像任何其他HTML页面,将其改为您心中的内容。

答案 2 :(得分:1)

您好我只想在阅读我的帖子回复并在线搜索并参考此论坛帖子http://forums.asp.net/t/1146098.aspx/1并使用HtmlAggilityPack http://htmlagilitypack.codeplex.com/wikipage?title=Examples

这是代码

Imports System.IO
Imports HtmlAgilityPack

Partial Class Default2
    Inherits System.Web.UI.Page

    Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)

        Dim mem As New System.IO.MemoryStream()
        Dim twr As New System.IO.StreamWriter(mem)
        Dim myWriter As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(twr)
        MyBase.Render(myWriter)

        myWriter.Flush()
        myWriter.Dispose()

        Dim strmRdr As New System.IO.StreamReader(mem)
        strmRdr.BaseStream.Position = 0
        Dim pageContent As String = strmRdr.ReadToEnd()
        strmRdr.Dispose()
        mem.Dispose()

        writer.Write(AlterWithHTMLAGP(pageContent))


    End Sub



    Function AlterWithHTMLAGP(ByVal pageSource As String) As String

        Dim htmlDoc As HtmlDocument = New HtmlDocument()

        htmlDoc.OptionFixNestedTags = True

        htmlDoc.LoadHtml(pageSource)

        Dim newNode As HtmlNode = HtmlNode.CreateNode("<div>" & "someHtml" & "</div>")

        Dim body As HtmlNode = htmlDoc.DocumentNode.SelectSingleNode("//body")

        body.PrependChild(newNode)


        Return htmlDoc.DocumentNode.WriteTo()

    End Function


End Class