为什么这段代码不能复制页面正文?

时间:2014-12-05 14:59:52

标签: asp.net vb.net

好吧,我讨厌实施一些我不太了解的事情,而且我正在为此而失眠。

以下是这种情况:我正在开发一个ASP.NET网站,该网站刚刚开始由其他人开发,当时他们使用的是VB.NET。我被要求将我的网页的VIEWSTATE移到页面底部,因为这应该增强网页蜘蛛对我们网页的可搜索性。

所以,在这里和那里进行了几个小时的搜索之后,我把这个课程拼凑起来,到目前为止工作得非常好。但令我感到困扰的是,我不明白为什么它运作良好,请帮助我理解它的工作原理。这是类代码:

Public Class Page
    Inherits System.Web.UI.Page


    Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)

        Dim viewStateStart As Integer
        Dim viewStateEnd As Integer
        Dim viewState As String = ""
        Dim FormEnd As Integer

        Dim sw As StringWriter = New StringWriter()
        Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)

        ' WHY does this work?  Why is this call to the base method not causing
        ' the HTML body to be duplicated????        
        MyBase.Render(hw)

        Dim bodyHTML As String = sw.ToString()

        hw.Close()
        sw.Close()

        viewStateStart = bodyHTML.IndexOf("<input type=""hidden"" name=""__VIEWSTATE""")

        If viewStateStart > -1 Then
            viewStateEnd = bodyHTML.IndexOf("/>", viewStateStart) + 2
            viewState = bodyHTML.Substring(viewStateStart, viewStateEnd - viewStateStart)
            bodyHTML = bodyHTML.Remove(viewStateStart, viewStateEnd - viewStateStart)

            FormEnd = bodyHTML.IndexOf("</form>") - 1
            bodyHTML = bodyHTML.Insert(FormEnd, viewState)
        End If

        writer.Write(bodyHTML)
    End Sub

End Class

我的问题是,我不了解我的生活,为什么这个类调用基本方法RENDER,并且没有渲染asp页面的主体两次,因为基本方法也会调用Writer .Write(htmlWriter)

为什么不是这样?

感谢您的帮助和评论。

1 个答案:

答案 0 :(得分:0)

注意基类编写html的地方:

Dim sw As StringWriter = New StringWriter()
Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)

MyBase.Render(hw)

hw不是作为参数传递的编写器,它只是一个临时的html编写器。这不是实际输出的结果。

稍后该方法使用任何基本方法编写:

Dim bodyHTML As String = sw.ToString()

并使用它,将ViewState字段移动到正文字符串的末尾。并且只有在方法的最后才将html写入实际的编写器,这将输出结束html:

writer.Write(bodyHTML)