asp.net生成靜態(tài)后冗余代碼,去掉viewstate生成的代碼
更新時(shí)間:2012年10月11日 01:12:47 作者:
asp.net生成的viewstate垃圾信息超過(guò)了20K,如果頁(yè)面前二K不是內(nèi)容會(huì)被引擎處罰,所以我們需要清理下asp.net生成靜態(tài)后冗余代碼
看著自己網(wǎng)站編譯之后的源文件,里面很多亂七八糟的東西,看了就覺(jué)得不舒服
還有form源文件,一看就知道是asp.net的頁(yè)面
知道腳本之家也是ASP.NET做的,就好奇地看看博客園的首頁(yè)源文件,發(fā)現(xiàn)沒(méi)有這些玩意,后來(lái)問(wèn)了下別人,
網(wǎng)上也找了點(diǎn)資料;
總結(jié)了一下自己的想法:
1、如果你的一個(gè)頁(yè)面沒(méi)有什么復(fù)雜的數(shù)據(jù)交互,例如登錄你可以改用成ajax的登錄,單條新聞界面也可以去掉,如果有留言也可以采用ajax的方式去完成!
2、后臺(tái)管理頁(yè)面,數(shù)據(jù)交互性一般都有點(diǎn)復(fù)雜,我就覺(jué)得沒(méi)有什么必要去掉哪些東西了,反正后臺(tái)對(duì)SEO沒(méi)有任何影響,我好奇地看了看博客園的后臺(tái)也是有的
不廢話了,直接貼代碼,在你的頁(yè)面代碼中加上如下函數(shù)
protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter html = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);
base.Render(tw);
string Temp = html.ToString();
string s1 = string.Empty, s2 = string.Empty, s3 = string.Empty, s4 = string.Empty, s5 = string.Empty, s6 = string.Empty;
int i = 0;
int j = 0;
i = Temp.IndexOf("<form");
if (i > 0)
{
j = Temp.IndexOf(">", i);
s1 = Temp.Substring(0, i);
s2 = Temp.Substring(j + 1, Temp.Length - j - 1);
}
i = s2.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\"");
if (i > 0)
{
j = s2.IndexOf(">", i);
s3 = s2.Substring(0, i);
s4 = s2.Substring(j + 1, s2.Length - j - 1);
}
i = s4.IndexOf("<input type=\"hidden\" name=\"__EVENTVALIDATION\" id=\"__EVENTVALIDATION\"");
if (i > 0)
{
j = s4.IndexOf(">", i);
s5 = s4.Substring(0, i);
s6 = s4.Substring(j + 1, s4.Length - j - 1);
Temp = s1 + s3 + s5 + s6;
}
else
{
Temp = s1 + s3 + s4;
}
Temp = Temp.Replace("</form>", "");
Temp = Temp.Replace("\r\n", "");
tw.Close();
Response.Write(Temp);
}
其實(shí)就是重寫(xiě)了Render方法,然后截取html源文件就能解決了,更具自己的情況去使用,覺(jué)得好用就用下!
如果你覺(jué)得簡(jiǎn)單,或者不屑,不要噴,有問(wèn)題請(qǐng)拍磚,謝謝!
2.查詢(xún)老外的解決辦法,是將代碼移動(dòng)到尾部,但發(fā)現(xiàn)部分網(wǎng)頁(yè)報(bào)錯(cuò), 之后發(fā)現(xiàn)把網(wǎng)頁(yè)的enableviewatate=false 明顯的viewstate 代碼減少。
原因總結(jié):
(1)、這是由于net記錄控件視圖狀態(tài)的. asp.net服務(wù)器控件默認(rèn)都記錄的.
如果你確定一個(gè)控件是不需要記錄控件狀態(tài),可以給他的EnableViewState賦值false禁用.
個(gè)人總結(jié):
關(guān)閉視圖也不是最終解決辦法,只會(huì)減少,最徹底的辦法就是把form表單做成普通的html標(biāo)簽。
省去runat="server"就可以。程序盡管重要,但如果做出來(lái)的程序沒(méi)有什么效果,是沒(méi)有意義的,
網(wǎng)友見(jiàn)解:
視圖狀態(tài),這可不是什么無(wú)用的代碼。你使用服務(wù)器控件,為什么在每一次提交后,會(huì)將信息以控件對(duì)象的方式讀取到呢?都是因?yàn)橛辛艘晥D狀態(tài)。
視圖狀態(tài)是可以禁用的,不過(guò)只使用EnableViewState=false是不徹底的,你還會(huì)在頁(yè)面中看到__VIEWSTATE的隱藏域。這是因?yàn)榫退憬昧怂?,還是會(huì)有一個(gè)服務(wù)器控件在那里使用,就是from runat="server",如果你將from編程普通html標(biāo)簽,那么頁(yè)面就干凈了。
當(dāng)然,禁用視圖狀態(tài)后,是會(huì)提升系統(tǒng)效率的,因?yàn)槌绦虿粫?huì)再去分析視圖狀態(tài)中值,再為控件對(duì)象初始化了。這樣做對(duì)于網(wǎng)站來(lái)說(shuō)是高效的,但如果是做引用程序,那就有點(diǎn)自找麻煩了。
復(fù)制代碼 代碼如下:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3NjgxMzM0MDIPZBYCZg9kFgIC……
還有form源文件,一看就知道是asp.net的頁(yè)面
復(fù)制代碼 代碼如下:
<form name="form1" method="post" action="smartDropDownList.aspx" id="form1">
知道腳本之家也是ASP.NET做的,就好奇地看看博客園的首頁(yè)源文件,發(fā)現(xiàn)沒(méi)有這些玩意,后來(lái)問(wèn)了下別人,
網(wǎng)上也找了點(diǎn)資料;
總結(jié)了一下自己的想法:
1、如果你的一個(gè)頁(yè)面沒(méi)有什么復(fù)雜的數(shù)據(jù)交互,例如登錄你可以改用成ajax的登錄,單條新聞界面也可以去掉,如果有留言也可以采用ajax的方式去完成!
2、后臺(tái)管理頁(yè)面,數(shù)據(jù)交互性一般都有點(diǎn)復(fù)雜,我就覺(jué)得沒(méi)有什么必要去掉哪些東西了,反正后臺(tái)對(duì)SEO沒(méi)有任何影響,我好奇地看了看博客園的后臺(tái)也是有的
不廢話了,直接貼代碼,在你的頁(yè)面代碼中加上如下函數(shù)
復(fù)制代碼 代碼如下:
protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter html = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);
base.Render(tw);
string Temp = html.ToString();
string s1 = string.Empty, s2 = string.Empty, s3 = string.Empty, s4 = string.Empty, s5 = string.Empty, s6 = string.Empty;
int i = 0;
int j = 0;
i = Temp.IndexOf("<form");
if (i > 0)
{
j = Temp.IndexOf(">", i);
s1 = Temp.Substring(0, i);
s2 = Temp.Substring(j + 1, Temp.Length - j - 1);
}
i = s2.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\"");
if (i > 0)
{
j = s2.IndexOf(">", i);
s3 = s2.Substring(0, i);
s4 = s2.Substring(j + 1, s2.Length - j - 1);
}
i = s4.IndexOf("<input type=\"hidden\" name=\"__EVENTVALIDATION\" id=\"__EVENTVALIDATION\"");
if (i > 0)
{
j = s4.IndexOf(">", i);
s5 = s4.Substring(0, i);
s6 = s4.Substring(j + 1, s4.Length - j - 1);
Temp = s1 + s3 + s5 + s6;
}
else
{
Temp = s1 + s3 + s4;
}
Temp = Temp.Replace("</form>", "");
Temp = Temp.Replace("\r\n", "");
tw.Close();
Response.Write(Temp);
}
其實(shí)就是重寫(xiě)了Render方法,然后截取html源文件就能解決了,更具自己的情況去使用,覺(jué)得好用就用下!
如果你覺(jué)得簡(jiǎn)單,或者不屑,不要噴,有問(wèn)題請(qǐng)拍磚,謝謝!
2.查詢(xún)老外的解決辦法,是將代碼移動(dòng)到尾部,但發(fā)現(xiàn)部分網(wǎng)頁(yè)報(bào)錯(cuò), 之后發(fā)現(xiàn)把網(wǎng)頁(yè)的enableviewatate=false 明顯的viewstate 代碼減少。
原因總結(jié):
(1)、這是由于net記錄控件視圖狀態(tài)的. asp.net服務(wù)器控件默認(rèn)都記錄的.
如果你確定一個(gè)控件是不需要記錄控件狀態(tài),可以給他的EnableViewState賦值false禁用.
個(gè)人總結(jié):
關(guān)閉視圖也不是最終解決辦法,只會(huì)減少,最徹底的辦法就是把form表單做成普通的html標(biāo)簽。
省去runat="server"就可以。程序盡管重要,但如果做出來(lái)的程序沒(méi)有什么效果,是沒(méi)有意義的,
網(wǎng)友見(jiàn)解:
視圖狀態(tài),這可不是什么無(wú)用的代碼。你使用服務(wù)器控件,為什么在每一次提交后,會(huì)將信息以控件對(duì)象的方式讀取到呢?都是因?yàn)橛辛艘晥D狀態(tài)。
視圖狀態(tài)是可以禁用的,不過(guò)只使用EnableViewState=false是不徹底的,你還會(huì)在頁(yè)面中看到__VIEWSTATE的隱藏域。這是因?yàn)榫退憬昧怂?,還是會(huì)有一個(gè)服務(wù)器控件在那里使用,就是from runat="server",如果你將from編程普通html標(biāo)簽,那么頁(yè)面就干凈了。
當(dāng)然,禁用視圖狀態(tài)后,是會(huì)提升系統(tǒng)效率的,因?yàn)槌绦虿粫?huì)再去分析視圖狀態(tài)中值,再為控件對(duì)象初始化了。這樣做對(duì)于網(wǎng)站來(lái)說(shuō)是高效的,但如果是做引用程序,那就有點(diǎn)自找麻煩了。
您可能感興趣的文章:
- asp.net 生成靜態(tài)時(shí)的過(guò)濾viewstate的實(shí)現(xiàn)方法
- asp.net 去除viewstate
- asp.net 禁用viewstate在web.config里
- asp.net viewstate 回發(fā)機(jī)制
- 使用正則Regex來(lái)移除網(wǎng)頁(yè)的EnableViewState實(shí)現(xiàn)思路及代碼
- 狀態(tài)保存機(jī)制之ViewState概述及應(yīng)用
- 禁止ViewState的3種解決方法
- viewstate和datatable動(dòng)態(tài)錄入數(shù)據(jù)示例
- asp.net中ViewState的用法詳解
- ASP.NET中控件的EnableViewState屬性及徹底禁用
相關(guān)文章
Asp.net的服務(wù)器推技術(shù) (Server Push)
在以往的和服務(wù)器端通信技術(shù)中,我們多數(shù)使用的是AJAX輪詢(xún)式訪問(wèn),也就是在Javascript中控制時(shí)間間隔,然后每隔一段時(shí)間就訪問(wèn)一次服務(wù)器,然后獲得數(shù)據(jù)或通知。但是這種輪詢(xún)方式的訪問(wèn)有90%是在做無(wú)用功。2010-01-01.Net Core導(dǎo)入千萬(wàn)級(jí)數(shù)據(jù)至Mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
今天我們談?wù)凪ySQL怎么高性能插入千萬(wàn)級(jí)的數(shù)據(jù)的,討論這個(gè)問(wèn)題牽扯到一個(gè)數(shù)據(jù)遷移功能,高性能的插入數(shù)據(jù),接下來(lái)通過(guò)本文給大家分享幾種實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0的方法實(shí)現(xiàn)
自從.Net6.0出來(lái)后,一直想之前開(kāi)發(fā)的項(xiàng)目升級(jí).Net6.0,本文就詳細(xì)的介紹一下如何將Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0,感興趣的小伙伴們可以參考一下2021-12-12C# XML操作 代碼大全(讀XML,寫(xiě)XML,更新,刪除節(jié)點(diǎn),與dataset結(jié)合等)
C#操作XML(讀XML,寫(xiě)XML,更新,刪除節(jié)點(diǎn),與dataset結(jié)合等),以下就是操作XML的所有方法,相信可以滿(mǎn)足很大一部份的使用了。2009-06-06ASP.NET Core根據(jù)環(huán)境變量支持多個(gè) appsettings.json配置文件
這篇文章主要介紹了ASP.NET Core根據(jù)環(huán)境變量支持多個(gè) appsettings.json配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08