如果說沒有什麼資料,只有少少的一點點是沒有什麼影響,
但是用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)」
沒有留言:
張貼留言