我有一個包含名爲PhoneInfo.ascx的控件的頁面。 PhoneInfo是使用LoadControl()動態創建的,然後initControl()函數被調用傳入初始化對象以在PhoneInfo中設置一些初始文本框值。.net在頁面生命週期中的ViewState
然後,用戶更改這些值,並在連接到「submit_click」事件的頁面上點擊提交按鈕。此事件調用PhoneInfo中的GetPhone()函數。返回的值包含所有新的用戶輸入值,但phoneId值(存儲在ViewState中且不由用戶編輯)總是返回爲空值。
我相信viewstate負責跟蹤用戶輸入的數據,因此我無法理解用戶值是如何返回的,而不是明確設置的ViewState [「PhoneId」]值!如果我在PhoneInfo的page_load事件中設置了ViewState [「PhoneId」]值,它會在回發後正確檢索它,但這不是一個選項,因爲我只能在頁面準備好提供時初始化該值。
我確定我只是搞亂頁面生命週期,任何建議或問題真的會幫助!我在下面包含了一個簡化版的實際代碼。
包含頁面的代碼隱藏
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;
}
}
我理解生命週期的這一部分,並同意最好的地方是page_init。但是,爲什麼用戶輸入的值通過我的GetPhone函數,如果它們通過viewstate回發保存?那些還不應該回歸爲空嗎? – caltrop 2010-03-31 17:58:14