2010年8月31日 星期二

整理網頁中的ViewState(二) - 從上面移到下面

幾乎很多ASP.NET網頁都會被SEO操作人員所詬病的就是那個「__VIEWSTATE」,
如果說沒有什麼資料,只有少少的一點點是沒有什麼影響,
但是用ASP.NET做網頁就一定會出現ViewState卡在原始碼前面的問題,
也總是會被問到,這鬼東西一定要出現在這個地方嗎?
有人索性就乾脆關掉ViewState,要是網頁非要用ViewState的話,怎麼辦?
絕大部分的人就是不管什麼SEO了……問題還是依然存在。


網路上找到了一篇文章,「Moving ViewState to the Bottom of the Page」,就可以解決ViewState佔著原始碼前頭的問題。
承接上一篇「整理網頁中的ViewState(一)
這些程式碼也是放至於PageBase中,
#region -- Move CompressViewState to htn Page Bottom --
 
static readonly Regex viewStateRegex = new Regex(
@"(<input type=""hidden"" name=""__COMPRESSEDVIEWSTATE"" value=""[a-zA-Z0-9\+=\\/]+"" />)",
RegexOptions.Multiline | RegexOptions.Compiled);
 
static readonly Regex endFormRegex = new Regex(
@"</form>",
RegexOptions.Multiline | RegexOptions.Compiled);
 
#region -- Render --
 
protected override void Render(HtmlTextWriter writer)
{
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
base.Render(htmlWriter);
 
string html = stringWriter.ToString();
int StartPoint = html.IndexOf("<input type=\"hidden\" name=\"__COMPRESSEDVIEWSTATE\"");
if (StartPoint >= 0)
{
int EndPoint = html.IndexOf("/>", StartPoint) + 2;
string viewstateInput = html.Substring(StartPoint, EndPoint - StartPoint);
html = html.Remove(StartPoint, EndPoint - StartPoint);
int FormEndStart = html.IndexOf("</form>") - 1;
if (FormEndStart >= 0)
{
html = html.Insert(FormEndStart, viewstateInput);
}
}
 
writer.Write(html);
}
 
#endregion
 
#endregion

程式碼中可以看到,將「__COMPRESSEDVIEWSTATE」給移到往也原始碼的下方。

其實說穿也沒有什麼,就是在SaveStateComplete之後的Render去覆寫它,並針對__COMPRESSEDVIEWSTATE的Tag進行處理。

(沒有對ViewState壓縮的就將名稱給改為__VIEWSTATE或是自定義的名稱)

希望對大家有幫助。

接下來,就來說說「壓縮頁面(Compress and GZip)」




沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。

最近的留言