У меня есть страница, содержащая элемент управления под названием PhoneInfo.ascx. PhoneInfo динамически создается с помощью LoadControl(), а затем функция initControl() называется передачей в объекте инициализации для установки некоторых исходных значений текстового поля в PhoneInfo..net ViewState в жизненном цикле страницы
Пользователь затем изменяет эти значения и обращается к кнопке отправки на странице, которая подключена к событию «отправить_click». Это событие вызывает функцию GetPhone() в PhoneInfo. Возвращаемое значение имеет все новые введенные пользователем значения, за исключением того, что значение phoneId (сохраненное в ViewState и NOT, отредактированное пользователем) всегда возвращается как null.
Я считаю, что viewstate несет ответственность за отслеживание введенных пользователем данных через обратную передачу, поэтому я не могу понять, как возвращаются значения пользователя, а не явно установленное значение ViewState ["PhoneId"]! Если я установил значение ViewState ["PhoneId"] в событие page_load 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 отделенного кода
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;
}
}
Я понимаю эту часть жизненного цикла и соглашаюсь с тем, что лучшее место для этого находится на странице_иниции. Но почему введенные пользователем значения переходят к моей функции GetPhone, если они были сохранены через postback через viewstate? Должны ли те, кто вернулся, тоже недействительны? – caltrop