好吧,我讨厌实施一些我不太了解的事情,而且我正在为此而失眠。
以下是这种情况:我正在开发一个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)
为什么不是这样?
感谢您的帮助和评论。
答案 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)