[ ASP.NET ] ボタンイベントの処理順序とポストバック( IsPostBack )

Pocket

ASP.NET のイベントがどのような処理順序で実行されるかを見ていきます。ASP.NET で Web アプリを作成するときには必須の知識となります。ここでは、Web フォーム上にボタンコントロールを 1つおいただけの画面での処理順序を確認していきます。

スポンサーリンク

以下のページを Default.aspx だとします。
ASPX

<form id="form1" runat="server">
<div>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</div>
</form>

VB

    Private _Value As Integer = 0

    Protected Sub Page_Load(ByVal sender As Object, _
                            ByVal e As System.EventArgs) Handles Me.Load
        _Value = 1
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, _
                                ByVal e As EventArgs) Handles Button1.Click
        _Value = 2
    End Sub

C#

    private int _value;

    protected void Page_Load(object sender, EventArgs e)
    {
        _value = 1;            
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        _value = 2;
    }

このページに最初にアクセスしたときは、以下の順序でイベントが処理されます。

  1. メンバ変数の初期化
  2. Page_Load() イベントハンドラ

次に、画面に追加したボタンをクリックすると、以下の処理でイベントが処理されます。

  1. メンバ変数の初期化
  2. Page_Load() イベントハンドラ
  3. Button1_Click() イベントハンドラ

このように、ASP.NET では、基本的には自分自身に POST し、毎回 Page_Load イベントも呼び出される仕組みになっています。このように、自分自身のページに POST する仕組みを ASP.NET ではポストバック( PostBack )と呼びます。 ASP.NETでは、基本的に(?)このポストバックという仕組みを利用してプログラミングを行うことになります。

また、ポストバック時にはメンバ変数 ( _value ) は再度初期化されます。うっかりとポストバック前の値を保持しているような処理を記述すると当然、期待通りの動きにはならないので、気をつけましょう。ついつい、やりがちなんです。なお、変数を static ( C# )や Shared ( VB )で宣言すると 2回目以降はポストバック時にメンバ変数の初期化はされなくなりますが、あまりお勧めはしません。

初めて呼び出されたか、ポストバックで呼び出されたかを判定する

上記のとおり、ボタンクリック時には、そのイベントだけサーバー上で処理されるわけではなく、 Page_Load イベントも必ず呼び出されます。しかし、ポストバック時には最初に呼び出された場合のみ行いたいなにかしらの初期化処理を記述し、ポストバック時は処理を行いたくない場合も出てきます。 その判定を行うには、IsPostBack プロパティを使用します。

VB

    Protected Sub Page_Load(ByVal sender As Object, _
	                        ByVal e As System.EventArgs) Handles Me.Load

        ' ポストバック時はリターン
        If IsPostBack = True Then
            Return
        End If
        
        ' ポストバック時はこの位置の処理は行われない
        
    End Sub

C#

    protected void Page_Load(object sender, EventArgs e)
    {
        // ポストバック時はリターン(何も処理しない)
        if ( IsPostBack == true)
        {
            return;
        }

        // ポストバック時はこの位置の処理は行われない
        
    }   

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *