Пользовательский контент пользовательского контроля в UpdatePanel исчезает при повторном нажатии кнопки

У меня есть следующая функция, которая обновляет содержимое UpdatePanel, добавляя / загружая пользовательский элемент управления ascx в заполнитель, который находится в default.aspx:

 protected void NavigationTab_Click(string ascxpath)
                {           
                        Control ctrl = LoadControl(ascxpath);
                        //cphmaincontent is my asp ContenPlaceHoderId in masterpage
                        PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent");
                        phmaincontent.Controls.Clear();
                        phmaincontent.Controls.Add(ctrl);
                        upmaincontent.Update();            
                }

Главная страница UpdatePanel:

<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:Label ID="lbmsg" runat="server" Text=""></asp:Label>
                        <asp:ContentPlaceHolder ID="cphmaincontent" runat="server">                       
                        </asp:ContentPlaceHolder>                         
                    </ContentTemplate>
                </asp:UpdatePanel>            

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

и у меня есть следующий код на моей главной странице только для того, чтобы получить путь управления ascx:

protected override void OnInit(EventArgs e)
        {           
               //raising an event to set ascx path
                mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click);

                base.OnInit(e);          
        } 

до сих пор все работает хорошо, после загрузки моего объекта ctrl с помощью вызова функции NavigationTab_Click я вижу мой ctrl в заполнителе и имеет кнопку и метку, но проблема заключается в том, что если я нажимаю эту кнопку, ей следует переназначить метку для некоторого текста, но вместо этого весь контент управления Ctrl исчезает, пожалуйста, помогите.

1 ответ

Решение

Когда вы добавляете элементы управления динамически, вы должны убедиться, что они воссоздаются при каждой обратной передаче. Вы также должны убедиться, что вы присваиваете тот же идентификатор, что и раньше, иначе события не будут запускаться правильно, а значения не могут быть перезагружены из ViewState. Это должно быть сделано не позднее Page_Load (лучше в Page_Init).

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

Таким образом, вы можете добавить элементы управления в обработчики событий, как вы сделали. Но они должны быть воссозданы на следующем постбэке. Поэтому вам нужно где-то хранить, что (например, идентификаторы) или сколько элементов управления уже создано. Это можно сделать, например, в ViewState или же Session, Затем вы можете назначить соответствующие идентификаторы элементам управления (например, с индексом или суффиксом идентификатора).

Вот некоторые дополнительные сведения на эту тему:

Другие вопросы по тегам