1. 程式人生 > >ViewState EnableViewState 禁用與使用心得

ViewState 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>
              <div align=center>
               <%#   DataBinder.Eval(Container,"DataItem.id") %>
              </div>    //不要使用任何控制元件,一樣能顯示,而且不佔用資源
              </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 ....