У меня есть страница, содержащая элемент управления под названием PhoneInfo.ascx. PhoneInfo динамически создается с помощью LoadControl (), а затем вызывается функция initControl (), передавая объект инициализации для установки некоторых начальных значений текстового поля в PhoneInfo.
Затем пользователь изменяет эти значения и нажимает кнопку отправки на странице, которая связана с событием submit_click. Это событие вызывает функцию GetPhone () в PhoneInfo. Возвращаемое значение содержит все введенные пользователем новые значения, за исключением того, что значение phoneId (хранится в ViewState и НЕ редактируется пользователем) всегда возвращается как нулевое.
Я считаю, что viewstate отвечает за отслеживание введенных пользователем данных через обратную передачу, поэтому я не могу понять, как возвращаются пользовательские значения, но не явно установленное значение ViewState ["PhoneId"]! Если я установлю значение ViewState ["PhoneId"] в событии pageInload PhoneInfo, оно вернёт его правильно после обратной передачи, но это не вариант, потому что я могу инициализировать это значение только тогда, когда страница готова предоставить его.
Я уверен, что я как-то испортил жизненный цикл страницы, любые предложения или вопросы действительно помогут! Я включил намного упрощенную версию фактического кода ниже.
Содержащий код страницы позади
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 codebehind
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;
}
}