Свойство null после обратной передачи - динамически загружаемый элемент управления
Я знаю, что этот вопрос задавался много раз прежде, но я подозреваю, что у меня есть уникальный сценарий.
Я загружаю дочерний элемент управления (ASCX) и устанавливаю свойство для этого элемента управления. Это прекрасно работает до обратной передачи, когда свойство имеет значение null.
При этом Первый класс, который загружает ChildControl:
protected override void CreateChildControls()
{
MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath);
control.MyProperty = base.MyProperty
Controls.Add(control);
}
Затем на моем Child Control я получил следующий код:
public partial class MyUserControl : UserControl
{
public MyType MyProperty { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
//Exception on next line because Property is null (only on postback)
var somevalue = MyProperty.SubProperty;
3 ответа
Хорошо. Позвольте мне попытаться объяснить это.
1. После создания страницы вы получаете полный жизненный цикл страницы.
2. Вы нажимаете на какой-то элемент управления, чтобы создать пользовательский элемент управления, и вы получаете его
3. Теперь вы вводите значение в этот элемент управления и получаете обратную передачу
4. На стороне сервера обратная передача обрабатывается, но, как вы видите, действия viewstate появляются, как только страница загружается.
Одной из основных целей viewstate является обработка управляющих событий, чтобы увидеть, изменились ли они, или сохранить их состояния или что-то еще.
5. Если в момент загрузки viewstate ваш элемент управления еще не создан, то все его события и значения будут игнорироваться.
Решение: либо сделайте статический контроль, либо просто спрячьте его, либо создайте его до начала действий viewstate.
Вам необходимо добавить элемент управления и задать свойства в событии Page_Init, иначе вы потеряете значение свойства.
В объяснениях Microsoft о жизненном цикле страницы ASP.NET написано, что динамически созданные элементы управления должны быть созданы в PreInit.
Это сработало для меня. Вот моя главная страница:
protected global::System.Web.UI.HtmlControls.HtmlGenericControl FiltersZone;
(...)
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
FiltersZone.Controls.Add(new PlanningFiltersSurgeonWeb());
}
Этот динамически созданный элемент управления ".ascx" содержит скрытое поле:
<input id="hidTxtPaint" type="hidden" name="hidTxtPaint" runat="server" />
Теперь я могу получить его значение из динамически созданного элемента управления ASCX. Page_Load
событие, после "submit
"или"__dopostback('hidTxtPaint')
"инициировано из JavaScript.
С другой стороны, значение скрытого поля всегда пусто после POST, если его родительский элемент управления ".ascx" добавлен в главную страницу Page_Load
событие.