2009-08-05 13 views
8

Il mio obiettivo finale è quello di avere un menu che aggiunge una classe alla voce di elenco che associa alla pagina corrente.ASP.NET MVC - Voce di elenco stile basata sul controller

Quindi ho impostato in modo tale che ogni controller sarà associato a un elemento nel mio menu. Devo aggiungere una classe a quell'elemento dell'elenco (cambiando colore, sfondo, qualunque cosa).

C'è un modo semplice per farlo? Passa un valore alla vista, quindi cosa?

+0

correlati: http://stackoverflow.com/questions/906423/jquery-add-class-on-current-item –

+0

@ Robert - Kind of, ma voglio un soluzione non javascript. Penserei idealmente, dato che ho tutte le informazioni di cui ho bisogno sul server, potrei farlo sul server. – Martin

risposta

12

In un mio progetto recente l'ho fatto utilizzando le estensioni HtmlHelper e ottenendo i dati dalla raccolta ViewContext.RouteData.Values.

Quindi costruire fuori un'estensione semplice come questo:

public static string OnClass(this HtmlHelper html, bool isOn) 
{ 
    if (isOn) 
     return " class=\"on\""; 

    return string.Empty; 
} 

È possibile costruire qualsiasi numero di combinazioni, per esempio

Basta testare l'azione in corso:

public static string OnClass(this HtmlHelper html, string action) 
{ 
    string currentAction = html.ViewContext.RouteData.Values["action"].ToString(); 

    return html.OnClass(currentAction.ToLower() == action.ToLower()); 
} 

test per una serie di azioni:

public static string OnClass(this HtmlHelper html, string[] actions) 
{ 
    string currentAction = html.ViewContext.RouteData.Values["action"].ToString(); 

    foreach (string action in actions) 
    { 
     if (currentAction.ToLower() == action.ToLower()) 
      return html.OnClass(true); 
    } 

    return string.Empty; 
} 

test per l'azione e il controller:

public static string OnClass(this HtmlHelper html, string action, string controller) 
{ 
    string currentController = html.ViewContext.RouteData.Values["controller"].ToString(); 

    if (currentController.ToLower() == controller.ToLower()) 
     return html.OnClass(action); 

    return string.Empty; 
} 

Ecc, ecc

Quindi è sufficiente lo chiamano nella vostra view (s) in questo modo

<ul id="left-menu"> 
    <!-- simple boolean --> 
    <li <%= Html.OnClass(something == somethingElse) %>>Blah</li> 
    <!-- action --> 
    <li <%= Html.OnClass("Index") %>>Blah</li> 
    <!-- any number of actions --> 
    <li <%= Html.OnClass(new string[] { "Index", "Details", "View" }) %>>Blah</li> 
    <!-- action and controller --> 
    <li <%= Html.OnClass("Index", "Home") %>>Blah</li> 
</ul> 

In qualunque modo la si guardi, le estensioni HtmlHelper sono tuo amico! :-)

HTHS
Charles

+0

Ho appena avuto la possibilità di esaminare e implementarlo. Freakin Awesome! Grazie amico! – Martin

+1

if (currentAction.ToLower() == action.ToLower()) .. Penso che il modo corretto per confrontare le stringhe sia utilizzando StringComparison.InvariantCultureIgnoreCase –

Problemi correlati