ポストバックを発生させない方法

ポストバックとは

PostBack

通常

現在ブラウザに表示しているページとは別のページをリクエストする。
ニュースサイトの様にあるページを読み終わったら次のページ(別URL)・・・と。
(静的ページでは同じページを再度呼び出す意味は無い)

ポストバック

動的なサイトにおいて同一ページ:同一URL内でパラメーターを変えてSQLの実行結果を表示したりする目的で、クライアント側からサーバー側に処理を移す為に使用する。
その際、クライアントに返す(表示する)ページが同一ページである、という処理。
イベントハンドラーの発生&ページ遷移しない処理と同義。
ASP.NETではボタンクリック等で発生させる事ができる。
(発生して欲しくない時にも発生してしまう)
ポストバックでは描画を全てやり直すので処理の無駄が大きい。
以下は、不必要なポストバックを発生させない、
またはポストバック発生時の描画を制限する方法
なお、F5押下時等の再読み込みもポストバック。

レスポンス時に処理させない

ポストバック時と通常時に処理を分岐させる
ポストバックバックか否か?の判定
if ( ! Page.IsPostBack ) {
 初回のみ実行させる処理
 (ポストバック時はさせない処理)
}
bool ret = Page.IsPostBack;
⇒ ret : true(ポストバック時)
⇒ ret : false(通常時)

リクエストさせない

TextBox、RadioButton、CheckBox等

AutoPostBackプロパティをFalseに。
<asp:TextBox runat="server" AutoPostBack="False"></asp:TextBox>
※デフォルト:False
通常、これらのサーバーコントロールの処理イベントは即座にハンドルされず(ポストバックが発生しない)、ボタンクリックイベント等のポストバック発生時にまとめて処理される。
わざと発生させたい場合にこれをTrueにする。
(「ASP.NET Webフォーム ポストバックを発生させる方法」参照)
ボタンにこのプロパティはない。

Button、Link等

OnClientClickプロパティにReturn False;を設定
<asp:Button runat="server" Text="Button" OnClientClick="return false;" />
クライアント側のイベントが実行された後、エラーが発生する為、
サーバー側のクリックイベントが発生しなくなりASP.NETの管理を離れる。
クリックによって何かの処理をさせる場合はJavaScript等の処理が必要。

※~aspx/~.js
<script>
  function fnMethod()
  {
    ~OnClientClickで発生するクライアント側イベント~
  };
</script>
<asp:Button
  runat="server"
  Text="Button"
  ※サーバー側イベント
  OnClick="myButton_Click"
  ※クライアント側イベント
  OnClientClick="fnMethod(); return false;" /><br />
※~.aspx.cs
public partial class WebForm1 : System.Web.UI.Page
{

 protected void myButton_Click(object sender, EventArgs e)
 {
  ~OnClickで発生するサーバー側イベント~
 }
}

通常
OnClientClick

OnClick

今回
myMethod()

return false ←ここで処理が止まる。

Button1_Click() ←発生しない。

※なお、サーバー側で処理しないのであればASP.NET用ボタンである<asp:Button>及びrunat属性は必要ないのでhtmlのボタンが望ましい。

<button
  onclick="fnMethod(); return false;">
  Button
</button>

Ajaxコントロールによる非同期通信

Ajax通信では厳密にはポストバックは発生するが、画面全体の再描画は行われない。
ASP.NET Webフォーム Ajax利用」参照

<form>要素

※フォーム内ボタン

  


<form>
  <input type="submit" value="更新" />
  ⇒リクエスト処理が発生する
</from>

※フォーム無し

<button>ボタン</button>
⇒リクエスト処理が発生しない
前述:return false; 設定した場合同様、
サーバー側へリクエストが発生しなくなり、ASP.NETの管理を離れる。
クリックによって何かの処理をさせる場合はJavaScript等の処理が必要。
Button、Link等」参照

参考

リンクボタンのPostBackUrl属性に別URLを指定した場合
※index.aspx
<asp:LinkButton
  ID="myLink"
  runat="server"
  OnClick="myLink_Click"
  PostBackUrl="~/next.aspx">
  LinkButton2
</asp:LinkButton>
index.aspx.cs(vb)におけるリンククリックイベントは発生せず、
(next.aspx.cs(vb)におけるリンククリックイベントも同様)
ポストバックは発生しない。
通常のリンク
<a href="next.aspx">aaa</a>
と同じ

前の記事

ASP.NET MVC 検証処理