2010-10-18 7 views
0

Ceci est mon code page maîtreComment faire référence au PlaceHolder dans une page principale, sur ma page enfant en utilisant JavaScript?

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteMaster.master.cs" 
    Inherits="ChildPage_Call_Js_in_MasterPage.SiteMaster" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 

    <asp:ContentPlaceHolder ID="head" runat="server"> 
    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder ID="phMenu" runat="server"></asp:PlaceHolder> 
     <asp:ContentPlaceHolder ID="ContentPlaceHolderBody" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    </form> 
    <script type="text/javascript" language="javascript"> 
     function showHideMasterPageContent() { 
      debugger; 
      var phMenu = document.getElementById("<%=phMenu.ClientID%>"); 
//   phMenu.style.display = 'none'; 

     } 
    </script> 
</body> 
</html> 

Et voici mon code Childpage:

<%@ Page Title="" Language="C#" MasterPageFile="~/SiteMaster.master" AutoEventWireup="true" 
    CodeBehind="ChildPage1.aspx.cs" Inherits="ChildPage_Call_Js_in_MasterPage.ChildPage1" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderBody" runat="server"> 
    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() { 

      debugger; 
      showHideMasterPageContent(); 
     }); 


    </script> 
</asp:Content> 

Maintenant ce que je veux faire est, en utilisant JavaScript, cacher le contenu "phMenu" dans le childpage. Pour cela, j'ai écrit une fonction appelée "showHideMasterPageContent" dans la page master que j'appelle dans la page enfant. Mon problème est que, je reçois une référence null car évidemment, quand j'ai regardé la source, je vois que seulement le contenu de phMenu est rendu et pas le contrôle phMenu lui-même. Maintenant, comment faire référence à phMenu dans JS?

Répondre

0

Vous avez raison. Un contrôle PlaceHolder est juste cela. Il rend seulement le contenu, et il n'y a pas de balises rendues pour lui-même.

Si vous voulez faire cela, vous devez entourer l'espace réservé avec un div (ou un panneau d'asp, si vous préférez).

 <div id="phMenuContainer"> 
      <asp:PlaceHolder ID="phMenu" runat="server"></asp:PlaceHolder> 
     </div> 

ou

 <asp:Panel ID="phMenuContainer" runat="server"> 
      <asp:PlaceHolder ID="phMenu" runat="server"></asp:PlaceHolder> 
     </asp:Panel> 

Ici, vous pouvez cacher la phMenuContainer div au lieu de l'espace réservé phMenu. Souvenez-vous cependant que si vous choisissez d'utiliser le Panel, vous devrez vous référer au contrôle par son ClientID.

<%=phMenuContainer.ClientID %> 
1

Dans ASP.NET 4.0, vous pouvez définir l'attribut ClientIDMode. Cela ne fonctionne pas pour les espaces réservés, mais cela fonctionne pour les panneaux. Cela vous donnera un identifiant client fiable que vous pourrez gérer via Javascript.

http://www.west-wind.com/weblog/posts/54760.aspx

+0

Hé les gars merci pour les réponses. J'ai oublié d'ajouter cela, cette Masterpage a été développée il y a environ 4 mois par mon équipe et ils utilisent "document.getElementById (" .... ")" dans beaucoup d'endroits sur d'autres pages qui héritent de cette page maître pour faire référence à le contenu de ce phMenu. En plus de cela, nous utilisons Telerik RadControls sur ces pages enfants qui utilisent également des javascripts se référant aux contrôles dans le menu phMenu. – Sandeep

+0

Le framework est 3.5SP1 donc pas de mode ClientID attirbute :(Maintenant, si j'ajoute un div ou un autre panneau autour de mon espace réservé, il est probable que la hiérarchie de nommage ASP.NET se déclenche et change les ID client de tous les contenus. .qui peut alors casser beaucoup de code JS qui a été ajouté au cours des derniers mois .. Y at-il un moyen sûr de le faire sans causer de problèmes de régression? – Sandeep

+0

Si vous annoncez un DIV qui a un ID dedans ASP.NET devrait ne changez pas l'ID à moins d'y ajouter runat = "server". – nopuck4you