Передача данных с contentpage на Masterpage с использованием технологии ajax

#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. Конечно, я только что отредактировал свой пост. Пожалуйста, взгляните на это.