2012-06-07 2 views
6

Я знаю, что этот вопрос задавался много раз, но я подозреваю, что у меня есть уникальный сценарий.Свойство null после обратной передачи - Динамически загруженный элемент управления

Я загружаю Child Control (ASCX) и устанавливаю свойство в этом элементе управления. Это работает отлично до тех пор, пока не будет возвращено значение, когда свойство равно null.

При этом первый класс, который загружает ChildControl:

protected override void CreateChildControls() 
{ 
    MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath); 
    control.MyProperty = base.MyProperty 
    Controls.Add(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; 
+0

Адрес: сгенерирован 'CreateChildControls'? Всегда ли он создан независимо от того, что такое «IsPostBack»? –

+0

Он всегда называется. Это решение Sharepoint. Событие/метод CreateChildControls() находится внутри класса, который наследуется от Microsoft.SharePoint.WebPartPages.WebPart. Я сомневаюсь, что если проблема связана с Sharepoint. – Fox

ответ

12

Ok. Позвольте мне попытаться объяснить это.
1. После того как страница будет создана, вы получите полную страницу lifecycle
2. Вы нажимаете на каком-то контроле, чтобы создать пользовательский элемент управления, и вы получите его
3. Теперь вы вводите значение для этого элемента управления, а также получение постбэка
4. На обратной стороне сервера обрабатывается, но, как вы видите, действия вида view отображаются, как только загружается страница.
Одной из основных целей viewstate является обработка управляющих событий, просмотр их изменения или сохранение их состояний или чего-то еще.
5. Если в момент, когда загружено viewstate, вы все еще не сконфигурированы, тогда все его события и значения будут проигнорированы.

Решение либо делает его статическим контролем, либо просто скрывает его, либо создавая его перед запуском действий в представлении.

+0

Tx за советом. Будет ли ответ вскоре после изменения кода. – Fox

+0

Спасибо. Ваш совет работал. Я переместил код Инициализации имущества на событие OnInit, и теперь все сработало нормально. – Fox

+0

Ваш прием, я потратил много времени на эту проблему, когда столкнулся с ней сам. –

5

Вам нужно добавить элемент управления и установить свойства в событии Page_Init, иначе вы потеряете значение свойства.

+0

Tx, занят, работая над этим. Вернусь в ближайшее время с результатами – Fox

+0

Thanks Imran. Ваш совет также помог. К сожалению, я не могу отметить два ответа правильно, но +1 к вам. Tx – Fox

+2

Не беспокойтесь, дорогая, рада, что у вас есть ответ, неважно, кто дал. Cheers –

2

В пояснениях Microsoft о странице ASP.NET life cycle указано, что динамически созданные элементы управления должны быть созданы в 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')», инициированного J avaScript.

С другой стороны, значение скрытого поля всегда пусто после POST, если его основной элемент управления «.ascx» добавлен в событие Page_Load главной страницы.

+0

Полное объяснение, более правильное и полезное, чем принятый ответ - Спасибо! – zanlok

Смежные вопросы