顯示具有 ViewState 標籤的文章。 顯示所有文章
顯示具有 ViewState 標籤的文章。 顯示所有文章

2012年7月4日 星期三

Button 每按一下就累加1的探討

不知道要如何命名比較好
這篇是一個ASP.NET技術:「ViewState」的討論
覺得很是重要,因為常常在抓取控制項的數值時出了錯,報錯常見和ViewState相關
所以特別拿出來研究研究
當然也不是自已的成果啦
只是把高手們的資料看看自已測試一下

先把結果寫出來,有興趣的再往下看吧

結果:

◎以上程式範例AspNet12.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

Partial Class AspNet12
    Inherits System.Web.UI.Page
    Dim i As Integer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' ===== 關於Viewstate:按鈕之後,數值累加1 =====
        ' 以下二個結論:
        ' 1、在使用時可以發現
        ' http 是一個 stateless(無狀態) 的協定
        ' 用最原始的response來做是不能累加的,因為
        ' 當傳遞完值後就關閉和server的連接
        ' 而ASP.NET不同處在於在值傳遞過程,都會紀錄每個「控制項」的狀態(viewstate)

        ' 2、如果把button1_click()裡的事件改放到Page_Load()裡
        ' 不管按下什麼控制項,都會發現Page_Load都會被觸發
        ' 這是Page_Load的特性
        ' 是以往傳統程式一個項一個事件,不按就沒有事件被執行的觀念不同
        ' 所以我們常在每個Page_Load裡面寫一段判別式,如下:

        'If Not Page.IsPostBack = True Then
        ' 這邊就是指第一次開啟web應用程序
        ' else
        ' 這邊的敘述句就是指第二、三、四、五…次讀取頁面
        'End If

        If Not Page.IsPostBack = True Then
            ' 也因為控制項的狀態被紀錄過一次了,所以可以用Page.IsPostBack來判定
            ' 就算重新載入了,該控制項的「屬性」還是會被保留住
            Me.Label1.ForeColor = Drawing.Color.Red
            Me.Label1.Text = 0
        End If
        ' 不給初始值=0的話,後面累加1的時候會報錯,即便vb這麼青菜,還是不給加字串的,所以
        ' 我們給他「方便」辯識用,初始值給他設定為 0,讓VB自動把這個「值」當成是「數字」。
        ' c# 就不可以這樣做了,c#較嚴謹,需要設定好每個變數的型別
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 用最原始的response來做是不能累加的
        ' i = i + 1
        ' Response.Write(i)
        ' 而用控制項的話,因為viewstate的關係,就能累加
        ' 底下用的Cint來將值轉化成int整數,是比較正式的寫法,不寫也行
        Me.Label1.Text = CInt(Me.Label1.Text) + 1
    End Sub
End Class
Related Posts Plugin for WordPress, Blogger...
// Dnow Function