Свойство 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;
 Peter Monks07 июн. 2012 г., 11:05
ГдеCreateChildControls звонил из? Всегда ли оно создано независимо от того, чтоIsPostBack является?
 Fox07 июн. 2012 г., 11:11
Это всегда называется. Это решение Sharepoint. Событие / метод CreateChildControls () находится в классе, который наследуется от Microsoft.SharePoint.WebPartPages.WebPart. Я сомневаюсь, хотя, если проблема связана с Sharepoint.

Ответы на вопрос(3)

Page_Init, иначе вы потеряете значение свойства.

 Fox07 июн. 2012 г., 12:54
Спасибо Имран. Твой совет тоже помог. К сожалению, я не могу пометить два ответа как правильные, но +1 для вас. Техас
 07 июн. 2012 г., 13:09
Не беспокойся, дорогой, рад, что ты получил ответ, не имеет значения, кто дал. ура
 Fox07 июн. 2012 г., 12:15
Tx, занят работой над этим. Скоро вернемся с результатами

жизненный циклнаписано, что динамически созданные элементы управления должны быть созданы в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 событие после & quot;submit& Quot; или & quot;__dopostback('hidTxtPaint')& Quot; инициировано из JavaScript.

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

 03 июн. 2017 г., 20:10
Подробное объяснение, более правильное и полезное, чем принятый ответ - спасибо!
Решение Вопроса


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

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

 Fox07 июн. 2012 г., 12:16
Спасибо за совет. Ответ будет вскоре после изменения кода.
 Fox07 июн. 2012 г., 12:53
Спасибо. Ваш совет сработал. Я переместил код инициализации свойства в событие OnInit, и теперь все работало нормально.
 07 июн. 2012 г., 13:08
Добро пожаловать, я потратил много времени на эту проблему, когда столкнулся с ней сам.

Ваш ответ на вопрос