2011-02-22 13 views
12

Tengo un sitio MVC pequeño que utiliza el helper Html.ActionLink para una barra de navegación. Una cosa que me gustaría cambiar es que ActionLink por defecto renderizará un enlace html a una página, incluso si esa es la página actual.Ayuda personalizada de ActionLink que sabe en qué página está

Por ejemplo, se crea un enlace como este:

<a href="/myUrl">Some title...</a> 

incluso si ya se encuentra en/myURL. Sería bueno si podría desactivar ese enlace y quizá insertar una clase especial de CSS para mostrar la página visitada en la actualidad, así:

<a href="#" class="currentPageCSS">My Url</a> 
<a href="/someOtherUrl">Some Other Url</a> 

Este problema se debe haber encontrado antes en un montón de sitios de MVC, por lo que' Tengo curiosidad por saber cómo lo han abordado otras personas.

Respuesta

32

Parece un buen escenario para rodar una ayuda HTML personalizada. Así que vamos a enrollo:

public static class LinkExtensions 
{ 
    public static MvcHtmlString MyActionLink(
     this HtmlHelper htmlHelper, 
     string linkText, 
     string action, 
     string controller 
    ) 
    { 
     var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); 
     var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); 
     if (action == currentAction && controller == currentController) 
     { 
      var anchor = new TagBuilder("a"); 
      anchor.Attributes["href"] = "#"; 
      anchor.AddCssClass("currentPageCSS"); 
      anchor.SetInnerText(linkText); 
      return MvcHtmlString.Create(anchor.ToString()); 
     } 
     return htmlHelper.ActionLink(linkText, action, controller); 
    } 
} 

y dentro de la vista:

<%= Html.MyActionLink("hello foo", "Index", "Home") %> 
<%= Html.MyActionLink("hello bar", "About", "Home") %> 
... 

y dependiendo de dónde se encuentre el ayudante generará el anclaje adecuado.

+3

¡Bonita idea! Desvergonzadamente lo robaré e integraré. – Iain

+0

@Iain, por favor sírvase :-) –

+0

¿dónde debe colocarse esta clase y cómo incluirla? –

Cuestiones relacionadas