2008-10-09 10 views
7

Wenn ich auf einer Website mit MasterPages navigiere, weiß die Anwendung, auf welcher Seite ich bin? Wenn ja, speichert es es in einem Objekt, auf das ich zugreifen kann?Weiß eine MasterPage, welche Seite angezeigt wird?

Der Grund ich frage ist, so kann ich diese ersetzen: für die Navigation

//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> 

Mit einer eleganteren Lösung, die den Link zu der Seite beleuchtet durch das Listenelement der ID auf „Strom“ gesetzt haben . Derzeit erstellt jede Seite die Navigation mit der aktuellen ID des jeweiligen Links neu.

+0

Könnten Sie freundlich es klar artikulieren, was du bist versuchen zu tun? – liggett78

+0

Ja, aktualisierte Frage wird hoffentlich weitere Informationen geben. – Anders

Antwort

13

Ich würde mit Chris zustimmen: Verwenden Sie ein Steuerelement, um die Anzeige dieses Menüs zu behandeln und es darauf aufmerksam zu machen, welcher Link hervorgehoben werden sollte. Hier ist eine Methode, die ich regelmäßig benutze. Es kann komplexer werden, wenn Sie mehrere Seiten haben, die den gleichen Link anders formatiert benötigen, aber Sie bekommen die Idee.

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

Danke! Ihr Code gab mir eine Idee für meine endgültige Lösung des Problems. – Anders

0

Sie können die Seite abrufen, indem Sie auf die Page-Eigenschaft zugreifen. IE:

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

Es gibt auch die Request.RawURL

8

die aktuelle URL Um innerhalb des Master-Seite, die Sie tun würde:

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

ich bewegen Sie die Navigation auch in den Master empfehlen Seite anstelle der Inhaltsseite. Dies erleichtert die Pflege/den Zugriff.

-1

Die Navigationssteuerung, nicht die Masterseite, sollte dafür verantwortlich sein, welche Seite gerade hervorgehoben ist.

Entweder sollte die geladene Seite dem Navigationselement mitteilen, wer es ist, oder das Navigationssteuerelement selbst sollte den Überblick behalten.

Der Punkt ist, dass Masterseiten einfach ein Halter sein sollen, in dem Inhalt angezeigt wird. Sie sollen nichts steuern.

+0

Ich benutze keine Navigationssteuerung, es ist nur eine gestylte Liste. – Anders

0

Sie würden wahrscheinlich einen der Request path aus der Master-Seite verwenden, um den aktuellen Wert festzulegen. Ich würde wahrscheinlich auch eine Eigenschaft auf der Masterseite haben, um sie zu überschreiben, so dass Seiten ohne Links oder etwas etwas Sinnvolles ergeben könnten.

-1

versuchen

this.Page.Master 

Es wird Ihnen die Masterseite der aktuellen Seite bekommen.

2

Ja, verwenden Sie den folgenden Code in Ihrer Master-Datei. Es gibt Ihnen den Namen der Inhaltsseite.

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

Er arbeitete für mich auf diese Weise - Dank Jared

Dies ist, was ich unser nav-Menü erhalten haben, um den aktuellen Menüpunkt für die Seite zu markieren, die wir sehen. Der Code befindet sich auf der Masterseite. Sie erhalten grundsätzlich den Dateipfad (Jareds Weg) Wir verwenden die "~" in unseren Links, so dass ich das ausstreifen musste. Iterieren Sie die menuItems-Auflistung des Menu-Steuerelements. Vergleichen Sie die Eigenschaft navigateUrl.

(Ich bin nicht der beste Coder und noch schlimmer zu erklären - aber es funktioniert und ich war ganz mit ihm chuffed)

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

Erklärung wird ihnen eine Menge helfen –

+0

Diese Lösung würde nicht funktionieren, wenn Sie zwei ASPX-Seiten haben, die den gleichen Code teilen. –

+0

Vielen Dank für die Dinge, die Sie erwähnt haben. –

Verwandte Themen