當前位置:首頁 > IT技術

ViewState EnableViewState 禁用與使用心得

時間:2019-07-20 03:41:03來源:IT技術作者:seo實驗室小編閱讀:77次「手機版」
 

enableviewstate

每個web控件都有個ViewState值,如果一個頁面有太多的web控件而不禁用他們的viewstate值的話,會讓頁面速度大大降低。那么哪些控件的

enableviewstate="false" 哪些控件的EnableViewState="true"呢?

一個個控件說起

textbox,如果你只需要取他的text里面的值,而不是要他響應什么事件,那他的viewstate是可以禁用的.

linkbutton 和asp:button還有別的按紐,如果你只需要他響應單擊事件,那他的viewstate可以禁用.

hyperlink,一般情況下不建議用他.他的功能和<a href基本上一樣,如無特殊需要盡量不要用他.他的值如果是需要后臺動態添加進去的

話,viewstate值不能禁用,否則在執行其它事件后他的值又不能顯示,如果在前臺就可以直接確定他的值,那他的viewstate是可以禁用的,但無論

他的值是需要前臺就可以確定還是需要后臺填充進去,<a href一樣都能完成的.所以一般情況下不需要使用他

所有驗證控件,只要不需要在后臺對他再進行編輯,都可以禁用viewstate,包括自定義驗證控件都可以禁用

dropdownlist,listbox還有checkboxlist這一類的都差不多,如果是前臺就能確定他的選項值,那他的viewstate可以禁用,不影響他的取值,

但如果他的值是需要后臺來梆定,又是需要在!ISPostBack里綁定的話,那他的viewstate值是不能禁用的,否則一執行其它事件以后,他的值就不

存在了.

其實最占用資源的就是datagrid,repeater,datalist等這些控件.

datagrid里面數據量龐大.但他的viewstate值在翻頁,編輯等操作時起到很大的作用,所以datagrid的viewstate值不能完全禁用.

我們這里以datagrid為例介紹一個如何禁用一批viewstate來優化速度

datagrid里<asp:BoundColumn>.他在瀏覽時是個Label,編輯時他是一個textbox.而label和textbox都是帶有viewstate.比如是一個5列20行的

datagrid,當他數據填充以后他就含有100個viewstate的值,這是一個龐大的數據..如果不想辦法禁用是很占用資源的.

<asp:BoundColumn>方法雖然方便,但盡量大家不要使用,用如下方法代替

<asp:TemplateColumn>

<ItemTemplate>

<p align=center>

? <%#?? databinder.eval(Container,"DataItem.id") %>

</p>??? //不要使用任何控件,一樣能顯示,而且不占用資源

</ItemTemplate>

<EditItemTemplate>

? <asp:TextBox ID="Textbox2" Text='<%# DataBinder.Eval(container,"DataItem.listid")%>' Runat="server"

EnableViewState=False Columns="自己賦值">

? </asp:TextBox>

</EditItemTemplate>????????????

</asp:TemplateColumn>

datagrid里的項,viewstate能禁用的盡量禁用,太占資源了

===========================

第一看asp.net是在做項目之前,感覺收獲也很大,第二次看gridview是在做完項目之后對GridView的回顧,這次的感覺是:我需要多想點,知識直到用時方覺少。直入正題吧,看gridview。

一、主要的事件

(1)RowDeleting?當點擊刪除按鈕時,執行的刪除代碼

(2)RowEding?當點擊編輯按鈕的時候執行的代碼。

(3)RowUpdating?當點擊修改按鈕的時候執行的代碼。

(4)selectedindexchanged || SelectedIndexChanging?事件,這兩個事件用哪個都可以,只不過執行順序有先后,當點擊選擇按鈕的時候執行的代碼,例如我們在用GridView做購物車的時候,就是用了選擇按鈕,就用到了SelectedIndexChanging事件。

(5)RowDataBound?事件,當頁面實例化完畢(控件實例化完畢),執行完Page_Load()方法的時候(數據在頁面上加載完畢),再來執行RowDataBound方法,一看Bound是過去式,就說明是在數據綁定完畢以后執行的方法。確實是,RowCreated事件是外面的Cell單元格創建好了,但是數據還未放到Cell單元格中時候所執行的方法。而RowDataBound事件是數據已經放到每一個Cell中,這時候所要執行的就是RowDataBound事件。進入RowDataBound事件中首先兩層IF判斷,判斷這一行的Type(RowType),判斷這一行數據的State,也就是狀態,一般Type主要使用DataRow,數據行。判斷State的時候要注意如果是編輯狀態下,如果只是寫了:

e.Row.RowState ==DataControlRowState.Edit

//這樣只是給普通項判斷是否出于編輯狀態,對于交替項沒有進行判斷,如何判斷:在后面在加上一句

e.Row.RowState ==(DataControlRowState.Edit | DataControlRowState.Alternate)

把上面的內容連起來:

if (e.Row.RowState== DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Edit |DataControlRowState.Alternate))

或者是這么寫:因為e.Row.RowState是一個枚舉類型的數據,枚舉類型就對應著一個具體的int類型的值:

我們可以在即使窗口中進行調試,進行判斷處于編輯狀態的普通行和交替行對應的int類型的值:分別為4、5。

所以我們又可以這么來寫:

if((int)e.Row.RowState== 4 || (int)e.Row.RowState == 5)

也可以。

二、GridView的屬性

視圖中查看到的屬性就不說了。

首先第一個:GridView.EditIndex ---->

這個屬性是得到當前編輯項的索引號,如果為修改操作,可以這么來做:

雙擊RowEditing事件進去寫代碼,首先為此屬性賦值:GridView.EditIndex == e.NewEditIndex;//GridView的編輯項的索引號為當前項的索引號。記住:e.NewEditIndex也是GridView一個重要的屬性,當前操作的這一行的索引號。

GridView一定要注意的:

三、ViewState——也是一個重點。

當.NET頁面在運行的時候,存?儲兩份數據,一份在頁面中顯示出來了,一份存儲ViewState中,首先一個認識:HTTP協議是一種無狀態的協議,再來理解什么是無狀態的協議,比如?說我這次訪問了新浪,新浪頁面一加載完畢就與我斷開連接,因為新浪服務器已經給了我頁面,于是新浪的服務器就與我的電腦斷開連接了,我在看什么,我在干什?么都不知道,那么存儲狀態用什么呢?首先第一點:session、再一點:Cookie、再一點:APPlication、再一點:在我們.NET中微軟為我們提供了ViewState。

Session是存儲在服務器端,用SessionID來區分不同的用戶對象,Cookie是存儲在用戶的硬盤中的某一個文件夾下,之前也和大伙看了一下在瀏覽器中臨時文件夾下的Cookie,怎么查找。

主要說ViewState,其實不止是GridView有ViewState,Repeater、DataList、TextBox等等表單控件和數據顯示控件都有ViewState,它所帶來的效果是什么,當我們在用TextBox來做一個注冊頁面的時候,如果是用普通的form表單進行數據提交,如果賬戶已存在,會直接跳轉到注冊頁面,表單中的數據全部沒有了,而用.NET中的TextBox控件如果填寫的用戶名已存在,它不會把數據全部清除,而是保留著。這就是ViewState的作用。

在GridView中,如果不存在ViewState,把ViewState禁用掉,會出現什么情況:當第一次訪問頁面的時候數據正常加載,如果GridView中存在按鈕,按鈕?默認都提交,一旦提交,重新加載頁面,數據全部沒有,實例化出頁面以后,頁面對象有了,GridView對象實例化出來了,控件有了,但是在?Page_Load()方法中一旦判斷是PostBack按鈕提交過來的就不會再執行Page_Load()中的代碼,Page_Load()是為實例化?好的控件填充數據的,一旦不走Page_Load()中的代碼,數據也就不會填充到GridView控件中,我們看到的效果就是,一點擊按鈕?GridView沒有了。這就是禁用ViewState的結果。可以解決,按鈕代碼執行完畢后在調用一下綁定數據的方法。

http協議是一種無狀態的協?議,我訪問了一個aspx頁面,服務器不會記住這個頁面對象,一旦在服務器中聲稱好了我請求的這個aspx頁面對象,便會立即釋放,再次訪問這個頁面的時?候,服務器不會記得第一次訪問時候的那個頁面對象,而是再次生成一個頁面對象,每次都是這樣。ViewState的作用就是存放一份數據,讓服務器記住我?這個頁面已經實例化過一次了,直接通過ViewState從服務器端取得上次實例化好的頁面對象。

這是.NET中所特有的,什么時候不必要用ViewState,也就是把ViewState禁用了呢?當頁面上沒有按鈕的時候,可以禁用掉。所以我們在使用GridView的時候一般用超鏈接?<A>標簽,而避免使用按鈕,因為有按鈕就必須有ViewState,頁面加載的速度肯定會慢下來。再就是有ViewState的頁面一定要分頁。?

后臺為按鈕添加javaScript事件:

在RowDataBound事件中寫代碼,查找按鈕,轉換成對應的Button類型,然后為按鈕的屬性:OnclientClick賦對應的JavaScript代碼即可。

例如:

(e.Row.Cells[5].Controls[2]as LinkButton).OnClientClick = "return window.confirm('確認要刪除嗎?')";?

在RowUpdating事件中如何取得每一個Cell中的值:

string name =(GridView1.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox).Text;

GridView1.Rows[e.RowIndex].Cells[1].Controls[0]

GridView1.Rows[e.RowIndex].Cells[1].FindControl("")

和DataList一定要區分好,DataList中是:

e.Item.FindControl("")as ....

相關閱讀

c++恢復msconfig.exe禁用的服務和自啟動項

msconfig.exe禁用自啟動項 msconfig.exe禁用自啟動項的時候,都是先刪除注冊表自啟動目錄下的相應的項,比如TIM,在msconfig禁用了之

Axure教程:按鈕的啟用和禁用設計

原型中常要用到按鈕的禁用和啟用,比如常見的:輸入手機號獲取驗證碼的獲取按鈕,在未輸入內容前按鈕不可點,輸入按鈕后,可點擊獲取按鈕獲

DirectX加速不可用、已禁用的解決方法

網上有很多人的DirectX加速不可用或者被禁用,最直接的表現就是大型游戲玩不了,工業軟件不能用,Aero特效打不開。那么這到底是怎么回

網頁禁用右鍵復制怎么辦?

如今很多網站為了防止他人復制文章,通常會加入禁止右鍵復制功能。但有時候,這些網站的內容我們需要用到,如果一個個打字,顯得太麻煩了

淘寶禁用外鏈圖片 疑封殺外鏈圖片服務商

從7月初開始,許多淘寶賣家發現商品中的外鏈圖片都不能正常顯示。而淘寶近期也發布公告稱:外部與圖片鏈接將無法編輯使用,理由是保障

分享到:

欄目導航

推薦閱讀

熱門閱讀

三肖必中特l三肖中特期期准免费