よくある誤解を解消することから始めましょう。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
プロパティをロードする最初の試行が成功したため、何も起こりません。
最終結果:ユーザーが入力した値は上書きされます。