2008-10-09 14 views
7

Cuando navego en un sitio web utilizando MasterPages, ¿la aplicación sabe en qué página estoy? Si es así, ¿lo almacena en un objeto al que puedo acceder?¿Sabe una página maestra qué página se está mostrando?

La razón por la que estoy pidiendo es para que pueda reemplazar a esto:

//masterpage 
<div id="nav_main"> 
    <ul><asp:ContentPlaceHolder ID="navigation" runat="server">      
    </asp:ContentPlaceHolder></ul> 
</div> 

//content page(s) 
<asp:Content ContentPlaceHolderID="navigation" ID="theNav" runat="server"> 
    <li><a href="default.aspx">Home</a></li> 
    <li id="current"><a href="faq.aspx">FAQ</a></li> 
    <li><a href="videos.aspx">Videos</a></li> 
    <li><a href="#">Button 4</a></li> 
    <li><a href="#">Button 5</a></li> 
</asp:Content> 

Con una solución más elegante para la navegación, lo que pone de relieve el vínculo a la página por tener el ID del elemento de la lista establecida en "actual" . Actualmente, cada página recrea la navegación con el ID de su enlace respectivo establecido en el actual.

+0

sería tan amable de articularlo con mayor claridad lo que está ¿Intentando hacer? – liggett78

+0

Sí, se espera que la pregunta actualizada brinde más información. – Anders

Respuesta

13

Estoy de acuerdo con Chris: utilice un control para controlar la visualización de este menú y tenga en cuenta qué enlace debe resaltarse. Este es un método que uso regularmente. Puede llegar a ser más complejo si tiene varias páginas que necesitarían el mismo vínculo con un estilo diferente, pero se entiende la idea.

Dim thisURL As String = Request.Url.Segments(Request.Url.Segments.Count - 1) 
Select Cast thisUrl 
    Case "MenuItem1.aspx" 
     lnkMenu1.CssClass = "Current" 
    Case "MenuItem2.aspx" 
     lnkMenu2.CssClass = "Current" 
End Select 
+1

¡Gracias! Tu código me dio una idea para mi solución final al problema. – Anders

0

Debería poder obtener la página accediendo a la propiedad de la página. IE:

string type = this.Page.GetType().Name.ToString(); 
-2

También existe la Request.RawUrl

8

Para obtener la URL actual solicitud desde la página principal puede hacer:

string s = this.Page.Request.FilePath; // "/Default.aspx" 

También se recomienda mover la navegación en el maestro página en lugar de la página de contenido. Esto facilitará el mantenimiento/acceso.

-1

El control de navegación, no la página maestra, debe estar a cargo de la página resaltada actualmente.

O bien la página que se carga debe notificar al elemento de navegación quién es, o el control de navegación en sí debe hacer un seguimiento de la misma.

El punto es que se supone que las páginas maestras son simplemente un titular en el que se muestra el contenido. Se supone que no controlan nada.

+0

No estoy usando un control de navegación, es solo una lista de estilos. – Anders

0

Probablemente solo use uno de los Request path desde dentro de la página maestra para establecer la corriente. Probablemente también tenga una propiedad en la página maestra para anularla, para que las páginas sin enlaces o algo así lo establezcan en algo razonable.

-1

tratar

this.Page.Master 

Le conseguirá la página principal de la página actual.

2

Sí, utilice el siguiente código en su archivo maestro. Le dará el nombre de la página de contenido.

Page.ToString().Replace("ASP.","").Replace("_",".") 
0

que trabajó para mí de esta manera - Gracias Jared

Esto es lo que hice para conseguir nuestro menú de navegación para resaltar el elemento de menú actual de la página que estamos visualizando. El código está en la página maestra. Básicamente, obtienes la ruta del archivo (forma de Jared) Utilizamos el "~" en nuestros enlaces, así que tuve que quitarlo. Iterar la colección menuItems del control de menú. Compara la propiedad navigateUrl.

(no soy el mejor codificador y peor aún a explicar - pero funciona y yo estaba muy contento con él)

protected void HighlightSelectedMenuItem() 
    { 
     string s = this.Page.Request.FilePath; // "/Default.aspx" 
     string nav; 
     if (s.Contains("~")) 
     { 
      s = s.Remove(s.IndexOf("~"), 1); 
     } 

     foreach (MenuItem item in navMenu.Items) 
     { 
      if (item.NavigateUrl.Contains("~")) 
      { 
       nav = item.NavigateUrl.Remove(item.NavigateUrl.IndexOf("~"), 1); 
       if (s == nav) 
       { 
        item.Selected = true; 
       } 
      } 

     } 
    } 
0
string s = this.Page.GetType().FullName; 
string[] array = s.Split('_'); 
int count = array.Count<String>(); 
string currentPage = array[count - 2]; 
+3

Explicación les ayudará mucho –

+0

Esta solución no funcionaría si tiene dos páginas .aspx que comparten el mismo código. –

+0

Gracias por las cosas que mencionaste. –

Cuestiones relacionadas