2010-11-26 10 views
2

Was wäre der beste/geeignetste Weg, um das Folgende in meiner MVC-Webanwendung zu erreichen?Stile programmgesteuert in ASP.NET anwenden MVC MasterPage View

Ich habe eine Ansicht namens Site.Master (es ist meine MasterPage-Ansicht), und über die Spitze dieser Ansicht habe ich 5 Links, die als meine Website-Navigation dienen, z.

<ul> 
    <li><a href="">Home</a></li> 
    <li><a href="">Links</a></li> 
    <li><a href="">Contact Us</a></li> 
    ...etc 
</ul> 

Was ich will, ist in der Lage sein, den entsprechenden Text-Link zu markieren, nach welchem ​​Teil der Website der Benutzer gerade sehen, so dass, wenn sie den ‚Kontakt‘ Seite verwendet hat, der Kontakt Link Auf der Masterseitenansicht würde ein anderer CSS-Stil angewendet werden.

In Web Forms war jeder meiner Links ein Hyperlink-Steuerelement, und ich hatte eine Eigenschaft im Code hinter der MasterPage, so dass jedem HyperLink-Steuerelement der relevante CssStyle zugewiesen wurde.

Was wäre der beste Weg, um dasselbe in meiner MasterPage-Ansicht zu erreichen, jetzt verwende ich MVC?

Antwort

4

würde ich wahrscheinlich einen HTML-Helfer schreiben, die diese Menü-Links und basierend auf dem aktuellen Controller und die Aktion gelten eine CSS-Klasse current auf den Anker erzeugen werden:

public static MvcHtmlString MenuLink(
    this HtmlHelper htmlHelper, 
    string linkText, 
    string actionName, 
    string controllerName 
) 
{ 
    string currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); 
    string currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); 
    if (actionName == currentAction && controllerName == currentController) 
    { 
     return htmlHelper.ActionLink(
      linkText, 
      actionName, 
      controllerName, 
      null, 
      new { 
       @class = "current" 
      }); 
    } 
    return htmlHelper.ActionLink(linkText, actionName, controllerName); 
} 

Und dann verwenden Sie diesen Helfer aus meiner Sicht :

.current { 
    ... 
} 
:

<ul> 
    <li><%= Html.MenuLink("Home", "Index", "Home") %></li> 
    <li><%= Html.MenuLink("Links", "Links", "Home") %></li> 
    <li><%= Html.MenuLink("Contact us", "Contact", "Home") %></li> 
</ul> 

Dann alles, was zu markieren übrig bleibt, ist diese current Klasse in einer CSS-Datei zu definieren,

+0

Hallo Darin. Das funktioniert fast perfekt. Das Problem, das ich habe, ist, dass ich für einen dieser Abschnitte der Website über 1 von 2 möglichen Aktionen für diesen Controller (Artikel oder LatestArticle) komme. Ich habe eine Teilansicht, die ich auf der Website verwende, die die Aktion "Artikel" statt der Standardaktion "LatestArticle" aufruft. Wenn ich also über meine Teilansicht zu diesem Abschnitt der Site navigiere, ist die Bedingung in der Helper-Methode nie erfüllt, da 'Article' nie als ActionName-Parameter an meine MenuLink-Methode übergeben wird. Irgendwelche Vorschläge? – marcusstarnes

+0

Nun, alles, was Sie tun müssen, ist die Signatur der Hilfsmethode zu ändern, um eine Liste von Aktionen anstelle einer einzelnen Aktion zu akzeptieren und dann zu überprüfen, ob die aktuelle Aktion mit einem der Elemente in dieser Liste übereinstimmt. –

Verwandte Themen