保存頁的所有視圖狀態信息和控件狀態信息。
基於SEO技術的開發,在沒有接觸MVC框架 Razor 引擎的時候,我們需要使用ASP.NET引擎,如果使用ASP.NET引擎的服務器端控件,那么在ASP.NET頁面中就會生成 __Viewstate隱藏域 ,__Viewstate隱藏域產生的“ 亂碼 ”對網絡爬蟲是極其不友好!!
“ 亂碼 ”如下:
1 <div class="aspNetHidden"> 2 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAevVXD1oYELeveMr0vHCmYP7LzJrIcTIdqhSMKVwuzUlG+r/E5r2IBU8/usjBP6bvE2c4iS0S7hMhxw1JoNuYef5SWTLAaw1o1yUXny4tbozOKqfv7TXcRdFrrz4sk+amqJ1HXkqp47r3PB8OAXkfQkk9SVCu9vqcV7t6ajMdAYdjyd0irvSRGXq8LavSPmz9M=" /> 3 </div>
那么所有 問題 就來了,在 商業項目 開發中就需要我們把__Viewstate隱藏域生成的“亂碼”去除掉。
這里我們討論如下幾個方案。
方案一:
去掉form的標簽的 runat="server" 屬性的話,就可以不生成__viewstate隱藏域,但有些情況服務器端控件就沒法正常使用了,所以在需要使用服務器端控件的時候就此方並不是太完美。
方案二:
給服務器端正控件的EnableViewState屬性設置為false,此時我們發現網頁的Viewstate有明顯代碼減少,但還是存在視圖狀態。。。
方案三:
些方案需要了解.NET的一些基類,如 System.Web.dll 。
System.Web.dll封裝了 LosFormatter 類。
在 MSDN 上對此類的描述是: 序列化 Web 窗體頁的視圖狀態。
此時我們需要LosFormatter類里封裝的Serialize方法,功能描述如下:將有限對象序列化 (LOS) 格式的對象轉換為視圖狀態值並將結果放置在 System.IO.Stream 對象中。
去除“亂碼”代碼如下:
/// <summary> /// 去除VIEWSTATE亂碼代碼如下所示: /// </summary> protected LosFormatter losFormatter = new LosFormatter(); /// <summary> /// 序列化所有視圖狀態信息和控件狀態信息。 /// </summary> /// <param name="viewState">要在其中存儲視圖狀態信息的 Object</param> protected override void SavePageStateToPersistenceMedium(object viewState) { string val = Request.Url + "__VIEWSTATE"; System.IO.MemoryStream stream = new System.IO.MemoryStream(); losFormatter.Serialize(stream, viewState); stream.Flush(); Session[val] = stream; }
