1

在 vb.net 或 C# 网站中

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

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

这必须很容易做到并且可能

谢谢

4

3 回答 3

1

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

如果您使用 WebForms,那么在渲染之前操作控件树并在其中插入元素会容易得多(PreRenderComplete 听起来不错)。

于 2012-07-21T04:13:08.093 回答
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 页面,将其更改为您喜欢的内容。

于 2012-07-21T05:03:39.533 回答
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
于 2012-07-21T18:02:02.170 回答