2010-05-13 27 views
10

Me pregunto si es posible agregar un parámetro de manera condicional en una llamada a un método.Agregar condicionalmente htmlAttributes a ASP.NET MVC Html.ActionLink

Por ejemplo, estoy prestación de un montón de enlaces (seis en total) para la navegación en mi Site.Master:

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

me gustaría incluir una clase CSS de "seleccionado" para el enlace si está en esa página. Así que en mi controlador estoy volviendo esto:

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

Y luego, en la vista que tengo un diccionario htmlAttributes:

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

Ahora mi única pregunta es ¿cómo puedo incluir los htmlAttributes para el adecuado ActionLink . Podría hacerlo de esta manera para cada enlace:

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

Pero eso parece un poco repetitivo. ¿Hay alguna manera de hacer algo como esto pseudo código:

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

Eso no es, obviamente, una sintaxis válida, pero hay una manera correcta de hacer eso? Estoy abierto a cualquier sugerencia totalmente diferente para representar estos enlaces. Me gustaría quedarme con algo como ActionLink que aprovecha el uso de mis rutas en lugar de codificar la etiqueta.

Respuesta

15

Aquí hay tres opciones:

<%= 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

respuesta perfecta. Gracias por las opciones! – macca1

+6

Me parece que esto no funciona para el atributo deshabilitado, ya que el navegador deshabilita los elementos html para el caso de 'disabled =" "'. Escribir su propio método html helper parece ser la única solución para ese caso. – arviman

+1

A partir de MVC 4, puede establecer cualquier atributo como nulo y no representará el atributo en absoluto. –

Cuestiones relacionadas