#c# #asp.net #ajax #updatepanel #master-pages
#c# #asp.net #ajax #updatepanel #мастер-страницы
Вопрос:
Я работаю над веб-приложением на основе ASP.Net и C #. Когда я нажимаю кнопку на странице содержимого, я хочу передать данные (строку) на Masterpage и показать их пользователю. Я знаю технику и коды, но проблема связана с Ajax. Поскольку кнопка на странице содержимого находится внутри Updatepanel, когда я нажимаю на кнопку, сообщение не будет отображаться на masterpage. Потому что только часть страницы будет обновлена, и я не знаю, как обновить главную страницу
Код внутри contentpage:
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder_Body_Member" ...>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ... ></asp:TextBox>
<asp:Button ID="ShowText" ... />
</ContentTemplate>
</asp:UpdatePanel>
Код внутри MasterPage (на самом деле это вложенная MasterPage):
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder_TopRightSide" runat="server"> ... </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder_Menu" runat="server"> ... </asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder_Body" runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder_Body_Member" runat="server"> </asp:ContentPlaceHolder>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder_Footer" runat="server">
<asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
<ContentTemplate>
<asp:Label ID="DataFromPage" ... ></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
Кнопка находится внутри «ContentPlaceHolder_Body_Member», а метка находится внутри «ContentPlaceHolder_Footer»
Ответ №1:
Чтобы добиться нужного вам результата, вам просто нужно внести небольшие изменения в дизайн главной страницы, как показано в приведенном ниже коде:
На вашей главной странице сначала поместите держатель содержимого внутри панели обновления:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="DataFromPage" runat="server" Text="Label"></asp:Label>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"></asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
Тогда на вашей странице содержимого у вас будет что-то вроде этого (почти такое же, как у вас)
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
Наконец, в вашем коде при событии нажатия кнопки вы можете присвоить свое значение элементу управления меткой главной страницы, как показано ниже:
protected void Button1_Click(object sender, EventArgs e)
{
Label myLabel = Page.Master.FindControl("UpdatePanel1").FindControl("DataFromPage") as Label;
myLabel.Text = "this is a message from my content page";
}
И вот результат :
ОБНОВЛЕНИЕ 1
Хорошо, помните, что если у вас есть вложенная панель обновления, то способ нахождения элемента управления в ней немного отличается. Также, если вам нужно внести изменения на другой странице содержимого, вам нужно заставить панель обновления вносить изменения в ваш код, поэтому ваш код должен быть таким:
// событие вашего элемента управления button должно найти панель обновления и метку:
protected void Button1_Click(object sender, EventArgs e)
{
UpdatePanel myUpdatePanel = Page.Master.Master.FindControl("ContentPlaceHolder_Footer").FindControl("UpdatePanel") as UpdatePanel;
Label myLabel = Page.Master.Master.FindControl("ContentPlaceHolder_Footer").FindControl("DataFromPage") as Label;
myLabel.Text = "this is a message from my content page";
myUpdatePanel.Update(); //force the panel to get updated
}
Приветствия
Комментарии:
1. Спасибо за ваш ответ. Проблема в том, что они находятся в разных ContentPlaceHolder. Кнопка в ContentPage находится внутри «ContentPlaceHolder_Body», а метка в MasterPage находится внутри «ContentPlaceHolder_Footer»
2. сможете ли вы также опубликовать свою главную страницу и страницы внутреннего содержимого?
3. Конечно, я только что отредактировал свой пост. Пожалуйста, взгляните на это.