2010-05-13 5 views
10

Je me demande s'il est possible d'ajouter de façon conditionnelle un paramètre dans un appel à une méthode.Ajouter conditionnellement htmlAttributes à ASP.NET MVC Html.ActionLink

Par exemple, je suis rendu un tas de liens (six au total) pour la navigation dans mon Site.master:

<%= Html.ActionLink("About", "About", "Pages") %> | 
<%= Html.ActionLink("Contact", "Contact", "Pages") %> 
<%-- etc, etc. --%> 

Je voudrais inclure une classe CSS de « sélectionné » pour le lien si c'est sur cette page. Donc, dans mon contrôleur je retourne ceci:

ViewData.Add("CurrentPage", "About"); 
return View(); 

Et puis dans l'opinion que j'ai un dictionnaire htmlAttributes:

<% Dictionary<string,object> htmlAttributes = new Dictionary<string,object>(); 
    htmlAttributes.Add("class","selected");%> 

Maintenant, ma seule question est de savoir comment puis-je inclure les htmlAttributes pour la bonne ActionLink . Je pourrais le faire de cette façon pour chaque lien:

<% htmlAttributes.Clear(); 
    if (ViewData["CurrentPage"] == "Contact") htmlAttributes.Add("class","selected");%> 
<%= Html.ActionLink("Contact", "Contact", "Pages", htmlAttributes) %> 

Mais cela semble un peu répétitif. Est-il possible de faire quelque chose comme ce code psuedo:

<%= Html.ActionLink("Contact", "Contact", "Pages", if(ViewData["CurrentPage"] == "Contact") { htmlAttributes }) %> 

C'est évidemment pas une syntaxe valide, mais est-il une bonne façon de le faire? Je suis ouvert à toutes les suggestions totalement différentes pour rendre ces liens. Je voudrais rester avec quelque chose comme ActionLink qui profite de l'utilisation de mes routes au lieu de coder en dur le tag.

Répondre

15

Voici trois options:

<%= Html.ActionLink("Contact", "Contact", "Pages", 
     new { @class = ViewData["CurrentPage"] == "Contact" ? "selected" : "" }) %> 

<%= Html.ActionLink("Contact", "Contact", "Pages", 
     ViewData["CurrentPage"] == "Contact" ? new { @class = "selected" } : null) %> 

<a href="<%=Url.Action("Contact", "Pages")%>" 
    class="<%=ViewData["CurrentPage"] == "Contact" ? "selected" : "" %>">Contact</a> 
+0

réponse parfaite. Merci pour les options! – macca1

+6

Je trouve que cela ne fonctionne pas pour l'attribut disabled, puisque le navigateur désactive les éléments html dans le cas de 'disabled =" "'. Écrire votre propre méthode d'aide html semble être la seule solution pour ce cas. – arviman

+1

À partir de MVC 4, vous pouvez définir n'importe quel attribut sur null et il ne rendra pas l'attribut du tout. –

Questions connexes