<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。
input1にハンドラ登録してないので何も起きないのでfalse。
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。
input1を押すと、trueになるが、text1が変わらない。
最初、ハンドラ登録はしてる。
input1を押すと、trueになる。
でも下のハンドラに来ない。
リロードしてるから、オブジェクトが一新されて、ハンドラが無いのかな。
そこで、Default.aspxで、
onserverclickでハンドラ登録するようにした。
Default.aspx.csは、
とする。
最初はfalse。
つまりこう。
input1を押すと、
ハンドラ登録されてるのでPostBackになる。
こちらだとハンドラが呼ばれてtext1が変わってる。
Sample/aspnet/Page/IsPostBack/src/Page_ at master · bg1bgst333/Sample · GitHub