PhoneInfo.ascx というコントロールを含むページがあります。PhoneInfo は LoadControl() を使用して動的に作成され、次に initControl() 関数が呼び出され、初期化オブジェクトを渡して PhoneInfo 内のいくつかの初期テキスト ボックス値を設定します。
次に、ユーザーはこれらの値を変更し、「submit_click」イベントに接続されているページの送信ボタンを押します。このイベントは、PhoneInfo 内の GetPhone() 関数を呼び出します。返される値には、phoneId 値 (ViewState に保存され、ユーザーによって編集されない) が常に null として返されることを除いて、新しいユーザーが入力した値がすべて含まれます。
ビューステートは、ポストバック全体でユーザーが入力したデータを追跡する責任があると信じているため、ユーザー値がどのように戻ってくるのか理解できませんが、明示的に設定された ViewState["PhoneId"] 値は理解できません! ViewState["PhoneId"] 値を PhoneInfo の page_load イベントに設定すると、ポストバック後に正しく取得されますが、ページが提供する準備が整ったときにのみその値を初期化できるため、これはオプションではありません。
どういうわけかページのライフサイクルを台無しにしているだけだと確信しています。提案や質問は本当に役に立ちます! 以下に、実際のコードを大幅に簡略化したバージョンを含めました。
ページの分離コードを含む
protected void Page_Load(object sender, EventArgs e)
{
Phone phone = controlToBind as Phone;
PhoneInfo phoneInfo = (PhoneInfo)LoadControl("phoneInfo.ascx"); //Create phoneInfo control
phoneInfo.InitControl(phone); //use controlToBind to initialize the new control
Controls.Add(phoneInfo);
}
protected void submit_click(object sender, EventArgs e)
{
Phone phone = phoneInfo.GetPhone();
}
PhoneInfo.ascx 分離コード
protected void Page_Load(object sender, EventArgs e)
{
}
public void InitControl(Phone phone)
{
if (phone != null)
{
ViewState["PhoneId"] = phone.Id;
txt_areaCode.Text = SafeConvert.ToString(phone.AreaCode);
txt_number.Text = SafeConvert.ToString(phone.Number);
ddl_type.SelectedValue = SafeConvert.ToString((int)phone.Type);
}
}
public Phone GetPhone()
{
Phone phone = new Phone();
if ((int)ViewState["PhoneId"] >= 0)
phone.Id = (int)ViewState["PhoneId"];
phone.AreaCode = SafeConvert.ToInt(txt_areaCode.Text);
phone.Number = SafeConvert.ToInt(txt_number.Text);
phone.Type = (PhoneType)Enum.ToObject(typeof(PhoneType), SafeConvert.ToInt(ddl_type.SelectedValue));
return phone;
}
}