我有一个包含名为PhoneInfo.ascx的控件的页面。通过使用LoadControl()动态创建PhoneInfo,然后调用initControl()函数并传入初始化对象来设置PhoneInfo中一些文本框的初始值。
然后用户更改这些值并单击页面上连接到“submit_click”事件的提交按钮。此事件在PhoneInfo内部调用GetPhone()函数。返回值具有所有新的用户输入值,但是phoneId值(存储在ViewState中且未由用户编辑)始终返回为空。
我相信viewstate负责跨postback跟踪用户输入的数据,因此我无法理解为什么用户值会返回,而明确设置的ViewState["PhoneId"]值却不会返回!如果我在PhoneInfo的page_load事件中设置ViewState ["PhoneId"]值,则在postback后正确检索它,但这不是一个选项,因为只有在页面准备好提供它时才能初始化该值。
我确定我只是在某种程度上搞乱了页面生命周期,任何建议或问题都将非常有帮助!我在下面包含了实际代码的大大简化版本。
包含页面的代码后台
然后用户更改这些值并单击页面上连接到“submit_click”事件的提交按钮。此事件在PhoneInfo内部调用GetPhone()函数。返回值具有所有新的用户输入值,但是phoneId值(存储在ViewState中且未由用户编辑)始终返回为空。
我相信viewstate负责跨postback跟踪用户输入的数据,因此我无法理解为什么用户值会返回,而明确设置的ViewState["PhoneId"]值却不会返回!如果我在PhoneInfo的page_load事件中设置ViewState ["PhoneId"]值,则在postback后正确检索它,但这不是一个选项,因为只有在页面准备好提供它时才能初始化该值。
我确定我只是在某种程度上搞乱了页面生命周期,任何建议或问题都将非常有帮助!我在下面包含了实际代码的大大简化版本。
包含页面的代码后台
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;
}
}