2014-12-05 75 views
0

好吧,我討厭實施我不太明白的事情,而我正在爲這個失去睡眠。這段代碼爲什麼不重複頁面的主體?

這裏是情況:我正在開發一個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

注意其中的基類是寫它的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) 
+0

我想我現在可以睡了:)非常感謝Andrei。當我達到聲望15我將能夠upvote :) – 2014-12-05 15:21:05

+0

@AjaxNgnurse,它的價值,你可以標記答案爲接受。主要是爲了表明它對你有幫助,以防其他人有類似的問題並找到這個線程 – Andrei 2014-12-05 18:11:34