よくある誤解を解消することから始めましょう。TextBoxブラウザは値がビューステートに保存されるためではなく、各POSTのフォームデータの一部として値を送信するため、aの値はポストバック間で保持されます。ビューステートは、表示されている動作とは何の関係もありません。
この質問に関連するページライフサイクルの段階は次のとおりです。
- イベントを発生させ
Initます。
- 投稿されたフォームデータをロードします(最初の試行)。
- イベントを発生させ
Loadます。
- 投稿されたフォームデータをロードします(2回目の試行)。
次に、各シナリオを見ていき、ユーザーがテキストボックスの値を変更してボタンをクリックするとどうなるかを見てみましょう。
シナリオ1a:コントロールを追加し、OnInitでTextプロパティを設定します。
private TextBox textBox = new TextBox { ID = "textBox" };
private Button button = new Button { ID = "submitButton", Text = "Submit" };
protected override void OnInit(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
this.textBox.Text = "Hello";
}
- イベントを発生させ
Initます。TextBoxがページに追加され、そのプロパティTextが「Hello」に設定されます。
- 投稿されたフォームデータをロードします(最初の試行)。プロパティは、
Textユーザーが入力した値に設定されます。
- イベントを発生させ
Loadます。何も起こりません。
- 投稿されたフォームデータをロードします(2回目の試行)。
Textプロパティをロードする最初の試行が成功したため、何も起こりません。
最終結果:ユーザーが入力した値は保持されます。
シナリオ1b:コントロールを追加し、OnLoadでTextプロパティを設定します。
protected override void OnLoad(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
this.textBox.Text = "Hello";
}
- イベントを発生させ
Initます。何も起こりません。
- 投稿されたフォームデータをロードします(最初の試行)。
TextBoxはまだページに追加されていないため、何も起こりません。
- イベントを発生させ
Loadます。TextBoxがページに追加され、そのプロパティTextが「Hello」に設定されます。
- 投稿されたフォームデータをロードします(2回目の試行)。プロパティは、
Textユーザーが入力した値に設定されます。
最終結果:ユーザーが入力した値は保持されます。
シナリオ2:OnInitにコントロールを追加します。OnLoadでTextプロパティを設定します。
protected override void OnInit(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
}
protected override void OnLoad(EventArgs e)
{
this.textBox.Text = "Hello";
}
- イベントを発生させ
Initます。がページにTextBox追加されます。
- 投稿されたフォームデータをロードします(最初の試行)。プロパティは、
Textユーザーが入力した値に設定されます。
- イベントを発生させ
Loadます。Textプロパティは「Hello」に設定されています。
- 投稿されたフォームデータをロードします(2回目の試行)。
Textプロパティをロードする最初の試行が成功したため、何も起こりません。
最終結果:ユーザーが入力した値は上書きされます。