Пользовательский контент пользовательского контроля в 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
, Затем вы можете назначить соответствующие идентификаторы элементам управления (например, с индексом или суффиксом идентификатора).
Вот некоторые дополнительные сведения на эту тему: