我有一个页面,其中包含一个名为 PhoneInfo.ascx 的控件。PhoneInfo 是使用 LoadControl() 动态创建的,然后调用 initControl() 函数传入初始化对象以在 PhoneInfo 中设置一些初始文本框值。
然后用户更改这些值并点击页面上的提交按钮,该按钮连接到“submit_click”事件。此事件调用 PhoneInfo 中的 GetPhone() 函数。返回的值包含所有新用户输入的值,除了 phoneId 值(存储在 ViewState 中且未由用户编辑)始终返回为 null。
我相信视图状态负责在回发中跟踪用户输入的数据,所以我无法理解用户值是如何返回的,但不是明确设置的 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;
}
}