web-dev-qa-db-ja.com

ページ読み込み時のIsPostBackの実装

ASP.NETを使用すればするほど、if (!IsPostBack) {}は無意味に見えます...

最初の例:

たとえば、私は問題をグーグル化しただけで、これをソリューションの一部として使用すると言いました:

_if (!Page.IsPostBack)
{
   Page.LoadComplete += new EventHandler(Page_LoadComplete);
}
_

コード化されたとおりに機能し、LoadCompleteは最初のロードでのみ起動します。ボタンまたはポストバックをトリガーするものをクリックした後、LoadCompleteイベントはフックされずに残り、イベントハンドラーをスキップします。したがって、それらの「修正」は最初のロードでのみ機能します。私はすぐにif (!Page.IsPostBack) {}をコメントアウトしました。これで、イベントは常に必要に応じてトリガーされます。

2番目の例:

動的に作成されたボタンにイベントをフックしようとしています(ちなみに、[GRR!]で作業できません)。私はこれを示す例を見ます:

_myEditToggleButton = new Button();
myEditToggleButton.ID = "editToggleButton"; 
//^GOTTA HAVE THIS FOR EVENTS TO WORK! (supposedly, I haven't seen it work...)
if (!IsPostBack)
{
   myEditToggleButton.Click += new EventHandler(myEditToggleButton_Click);
}
Controls.Add(myEditToggleButton);
_

最初の例と同様に、最初のページの読み込み後にイベントがフックされないため、ボタンをクリックするとポストバックがトリガーされるため、ボタンは1回クリックすると「不活性」になります。

質問:

いつif (!IsPostBack) {}を使用する必要がありますか?マークアップで作成されたコントロールのみに関係していると思います。

20
Yerg

つまり、最初のロードでのみ何かを実行する必要があるたびに、それを使用します。

Page.IsPostBackの典型的な使用法は、データバインディング/コントロールの初期化です。

if(!Page.IsPostBack)
{
   //Control Initialization
   //Databinding
}

ViewStateControlStateで永続化されるものは、ポストバックごとに再作成する必要がないため、不要なコードの実行を回避するために、この状態を確認してください。

もう1つの古典的な使用法は、Querystringパラメーターの取得と処理です。ポストバックでこれを行う必要はありません。

17
Claudio Redi

初回以外の操作を繰り返す必要がない場合。

これは、ページまたはコントロールが最初に読み込まれるときにのみ実行する必要がある負荷の高い操作(データベースからのデータの取得やListItemの作成など)で使用します。ページがサーバーにポストされてから再ロードされた場合、操作を繰り返す必要はありません。 IsPostBackの値をテストすることで、高価な操作をスキップできます。

6
Spooks

フォームデータを処理するためのものです。

POSTされたデータを処理する場合は、ページが実際にデータをポストした場合にのみ処理します。最初のロード時ではありません。したがって、IsPostBackフラグです。

4
jvenema

ポストバックを引き起こした場合に起こり得ることは、意味を持たずにコントロールの状態を変更できることです。たとえば、gridviewを使用する場合、編集モード中にポストバックすると、編集したフィールドにアクセスできなくなります。

多くの場合、サーバーにアクセスしたときに情報がページに表示されないようにする必要があります。これがポイントです。

if(!Page.IsPostBack)
3
Brett
protected void Page_Load(object sender, EventArgs e)            
{
    if (!IsPostBack) { 
        SqlConnection conn = new SqlConnection("Data Source=-----; Database=-----; Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter();
        conn.Open();
        da.SelectCommand = new SqlCommand("Select Command",conn);
        conn.Close();
        DataTable dt = new DataTable();
        da.Fill(dt);

        ddlSearch.DataSource = dt;
        ddlSearch.DataTextField = "---";
        ddlSearch.DataValueField = "---";
        ddlSearch.DataBind();
    }
}
1
Yasir Antaal

イベントを発生させることができるときはいつでも、イベントハンドラーを関連付ける必要があります(PostBackステータスに関係なく)。

また、コントロールを動的に追加するときは、必ずasp page lifecycle を確認してください

1
StuartLC

また、コントロールを初期化する場合は、IsPostBackを使用する必要があります。そうしないと、ロードのたびにデフォルトに戻ります。これは、ユーザーがフォームを使用しようとすると、入力した値がデフォルトにリセットされるため、ユーザーを混乱させます。

0
logain

まず、Visual Studioでプロジェクトを開始するときに、ポストバックとは何かを理解する必要があります。
if statementは、isPostBacktrueまたはfalseであるかどうかを確認しますPage_Loadメソッド、この時点では、isPostBackfalseであり、postbackではないことを意味します。
ここでbuttonをクリックします(ボタンがない場合は、ボタンとボタンクリックメソッドも追加してください)。この時点で、サーバーにリクエストを送信します。サーバーが応答すると、このプロセスはpostbackと呼ばれ、buttonをクリックするとトリガーされます。

あなたが本当に気づく必要がある一つのこと、Page_Loadメソッドだけでなく、Button_clickメソッドが実行されるので、isPostBacktrueです。これは、ポストバックであることを意味します。ボタンをクリックしたため、実際にはポストバックです。

0
Zhenxiao Hao