Page.IsPostBack

<input>タグのtypeが"submit"だったり、<input>タグのtypeが"button"や<button>タグでもServerClickにハンドラを登録していたりする場合で、押すとPageがリロードされてform情報が自分自身に送信される。
これをPostBackというらしいが、最初にPageをLoadする時も、PostBackする時も、Loadは呼ばれるので、Page.IsPostBackでPostBackかどうかを判定する。

Page.IsPostBack プロパティ (System.Web.UI) | Microsoft Docs

Default.aspxが、

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Page_._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <input id="text1" type="text" value="text1" runat="server" />
            <input id="input1" type="button" value="input1" runat="server" />
            <input id="submit1" type="submit" value="submit1" runat="server" />
        </form>
    </body>
</html>

Default.aspx.csが、

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Page_
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                Title = "IsPostBack == true";
            }
            else
            {
                Title = "IsPostBack == false";
            }
        }
    }
}

この時、

最初のLoadではfalse。
最初のLoadではfalse。

最初のLoadではfalse。

input1にハンドラ登録してないので何も起きないのでfalse。
input1にハンドラ登録してないので何も起きないのでfalse。

input1にハンドラ登録してないので何も起きないのでfalse。

submitは、HTMLの機能としてPostBackするのでtrue。
submitは、HTMLの機能としてPostBackするのでtrue。

submitは、HTMLの機能としてPostBackするのでtrue。
さて、

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Page_
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                Title = "IsPostBack == true";
            }
            else
            {
                Title = "IsPostBack == false";
                input1.ServerClick += new EventHandler(input1_ServerClick);
            }
        }

        void input1_ServerClick(object sender, EventArgs e)
        {
            text1.Value = "Clicked!";
        }
    }
}

最初のLoadで、input1のServerClickにハンドラを登録。

最初のLoadではfalse。
最初のLoadではfalse。

最初のLoadではfalse。

input1を押すと、trueになるが、text1が変わらない。
input1を押すと、trueになるが、text1が変わらない。

input1を押すと、trueになるが、text1が変わらない。

最初、ハンドラ登録はしてる。
最初、ハンドラ登録はしてる。

最初、ハンドラ登録はしてる。

input1を押すと、trueになる。
input1を押すと、trueになる。

input1を押すと、trueになる。
でも下のハンドラに来ない。
リロードしてるから、オブジェクトが一新されて、ハンドラが無いのかな。
そこで、Default.aspxで、

onserverclickでハンドラ登録するようにした。
Default.aspx.csは、

とする。

最初はfalse。
最初はfalse。

最初はfalse。

つまりこう。
つまりこう。

つまりこう。
input1を押すと、

ハンドラ登録されてるのでPostBackになる
ハンドラ登録されてるのでPostBackになる

ハンドラ登録されてるのでPostBackになる。

こちらだとハンドラが呼ばれてtext1が変わってる。
こちらだとハンドラが呼ばれてtext1が変わってる。

こちらだとハンドラが呼ばれてtext1が変わってる。

Sample/aspnet/Page/IsPostBack/src/Page_ at master · bg1bgst333/Sample · GitHub