Свойство null после обратной передачи — динамически загружаемый элемент управления

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

Я загружаю дочерний элемент управления (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;

person Fox    schedule 07.06.2012    source источник
comment
Откуда CreateChildControls вызывается? Всегда ли он создается независимо от того, что такое IsPostBack?   -  person Peter Monks    schedule 07.06.2012
comment
Он всегда называется. Это решение Sharepoint. Событие/метод CreateChildControls() находится в классе, который наследуется от Microsoft.SharePoint.WebPartPages.WebPart. Однако я сомневаюсь, что проблема связана с Sharepoint.   -  person Fox    schedule 07.06.2012


Ответы (3)


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

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

person Johnny_D    schedule 07.06.2012
comment
Тс за совет. Будет ответ вскоре после изменения кода. - person Fox; 07.06.2012
comment
Спасибо. Ваш совет сработал. Я переместил код инициализации свойств в событие OnInit, и теперь все работает нормально. - person Fox; 07.06.2012
comment
Добро пожаловать, я потратил много времени на эту проблему, когда столкнулся с ней сам. - person Johnny_D; 07.06.2012

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

person Imran Balouch    schedule 07.06.2012
comment
Тх, занят работой над этим. Скоро вернусь с результатами - person Fox; 07.06.2012
comment
Спасибо Имран. Ваш совет тоже помог. К сожалению, я не могу отметить два ответа как правильные, но +1 вам. Тх - person Fox; 07.06.2012
comment
Не беспокойтесь, дорогая, рад, что вы получили ответ, неважно, кто дал. Ваше здоровье - person Imran Balouch; 07.06.2012

В пояснениях 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" />

Теперь я могу получить его значение из динамически созданного события Page_Load элемента управления ASCX после "submit" или "__dopostback('hidTxtPaint')", инициированного из JavaScript.

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

person Elo    schedule 16.02.2016
comment
Всестороннее объяснение, которое более правильно и полезно, чем принятый ответ - Спасибо! - person zanlok; 03.06.2017