2

シナリオ1:、 を作成しTextBoxButtonそれらをページに追加して、すべての'sまたはイベントにTextBox's値を設定します。PageOnInitOnLoad

ポストバック/フォーム投稿を行うとき、Buttonクリックを介して、 TextBox(ブラウザから)入力したものはすべて、次のポストバック/ページの読み込みまで保持されます。

シナリオ2:TextBoxと を作成し、イベントButtonのページに追加します。イベントに値OnInitを設定し、TextBoxOnLoad

ポストバック/フォーム投稿を行うと、Buttonクリックを介して、 TextBox(ブラウザから)入力したものは保持されず、代わりにOnLoadイベント中に割り当てた値が表示されます。

誰かがここで何が起こっているのか説明できますか?推測では、ViewState追跡はTextBox追加された後のイベントでのみ開始されるか、次のイベント(OnLoad)で割り当てられるとすぐに「ダーティ」とマークされますが、これらは実際には推測です!

4

4 に答える 4

3

よくある誤解を解消することから始めましょう。TextBoxブラウザは値がビューステートに保存されるためではなく、各POSTのフォームデータの一部として値を送信するため、aの値はポストバック間で保持されます。ビューステートは、表示されている動作とは何の関係もありません。

この質問に関連するページライフサイクルの段階は次のとおりです。

  1. イベントを発生させInitます。
  2. 投稿されたフォームデータをロードします(最初の試行)。
  3. イベントを発生させLoadます。
  4. 投稿されたフォームデータをロードします(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";
}
  1. イベントを発生させInitます。TextBoxがページに追加され、そのプロパティTextが「Hello」に設定されます。
  2. 投稿されたフォームデータをロードします(最初の試行)。プロパティは、Textユーザーが入力した値に設定されます。
  3. イベントを発生させLoadます。何も起こりません。
  4. 投稿されたフォームデータをロードします(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";
}
  1. イベントを発生させInitます。何も起こりません。
  2. 投稿されたフォームデータをロードします(最初の試行)。TextBoxはまだページに追加されていないため、何も起こりません。
  3. イベントを発生させLoadます。TextBoxがページに追加され、そのプロパティTextが「Hello」に設定されます。
  4. 投稿されたフォームデータをロードします(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";
}
  1. イベントを発生させInitます。がページにTextBox追加されます。
  2. 投稿されたフォームデータをロードします(最初の試行)。プロパティは、Textユーザーが入力した値に設定されます。
  3. イベントを発生させLoadます。Textプロパティは「Hello」に設定されています。
  4. 投稿されたフォームデータをロードします(2回目の試行)。Textプロパティをロードする最初の試行が成功したため、何も起こりません。

最終結果:ユーザーが入力した値は上書きされます。

于 2012-08-31T17:50:06.737 に答える
1

コントロールのビューステートトラッキングは、コントロールのinitイベントの終了時にオンになります。制御イベントはページの前に発生することに注意してください。

PreInitは、動的コントロールを追加する必要があるイベントですが、Initは機能しますが、一貫性のない動作が見られる場合があります。明らかな理由から、負荷は使用しないでください。

コントロールの初期値を設定するときは、常に!IsPostbackを確認してください。

于 2012-08-31T17:05:35.770 に答える
0

Load View Stateは、InitとLoadの間、Initの後、Lodの前に発生します

ビューステートのロードステージは、ページがポストバックされた場合にのみ発生します。この段階で、前回のページ訪問から保存されたビューステートデータが読み込まれ、ページのコントロール階層に再帰的に入力されます。ビューステートが検証されるのはこの段階です。

ビューステートを使用してデータを永続化する場合は、投稿ごとにデータを再バインドしないでください

If(! IsPostBack)
{
   //Bind here your textbox
}

そして、ビューステートを使用して永続化します

于 2012-08-31T17:04:53.303 に答える
-1

ViewStateトラッキングは、InitCompleteイベントでオンになります。したがって、OnInitにコントロールを追加すると、ビューステートによって追跡されません。一方、Page_Loadにコントロールを追加すると、ビューステートによって追跡され、テキストボックスの永続化された値を取得できます。

于 2012-08-31T16:28:28.460 に答える