みなさん、何とかまた更新できます。


HTTPはステートレスですので、ページがはじめて呼ばれたのか、またはポストバックなのかでロードなどのイベントで初期化をすべきなのか判断されるのに苦労していたりしませんか?(私はしてます汗)


つい最近IsCrossPagePostBackというものがあるということを知り、よく調べもせず使ってみたりしていました。


そこで今回はIsPostBackIsCrossPagePostBackの違いを検証してみようと思います。


じつはこの二つは対象となるオブジェクトが違うのです。


IsPostBackは現在処理をしようとしているPageで使い、IsCrossPagePostBackはPreviousPageで使うようです。


ということで、サンプルのソースを見せたいと思います。


[page1.aspx]

<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" PostBackUrl="~/page2.aspx" Text="ページ2へ" />
<br />
<br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/page2.aspx">ページ2へ</asp:HyperLink><br />
<br />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Transferで" /></div>
</form>
</body>

--------------------------------------------------------------------

[page1.aspx.cs]

protected void Button2_Click(object sender, EventArgs e)
{
Server.Transfer("page2.aspx");
}

--------------------------------------------------------------------

[page2.aspx]

<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>&nbsp;</div>
</form>
</body>

--------------------------------------------------------------------

[page2.aspx.cs]

protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsCrossPagePostBack)
{
Label1.Text = "Page.IsCrossPagePostBack";
}
else
{
Label1.Text = "×";
}
if (Page.IsPostBack)
{
Label2.Text = "Page.IsPostBack";
}
else
{
Label2.Text = "×";
}
if (PreviousPage != null)
{
if (PreviousPage.IsCrossPagePostBack)
{
Label3.Text = "PreviousPage.IsCrossPagePostBack : name is " + PreviousPage.Title;
}
else
{
Label3.Text = "PreviousPage IS OK";
}
}
else
{
Label3.Text = "×";
}
}


と以上のような感じです。


動かしてみるとわかると思いますが、<a>タグとTransferを使ったものではIsCrossPostBackとはみなされないようです。


間違い等に気付いた方いましたら、コメントなどで教えていただければありがたいです。