Malgré tout le bien que je pense d’ASP.NET MVC (qui est, je le rappelle, le meilleur framework de développement web du monde, que dis-je, de l’univers !), je me vois parfois obligé de reconnaître qu’il a des défauts. L’un des plus ennuyeux est l’utilisation de chaînes de caractères et d’objets anonymes dans les helpers Html, source potentielle d’erreurs, qui ne seront pas détectées à la compilation.

Pour remédier à ce soucis, nous avons la possibilité d’étendre le Html Helper, afin d’ajouter nos propres méthodes de création de liens.

Pour commencer, nous allons créer une classe par contrôleur, dans laquelle nous définirons les méthodes qui renverront les liens vers chaque action. Cette classe va se baser sur le HtmlHelper pour créer les liens, donc n’oublions pas de le passer dans le constructeur :

public class HomeLinks 
{ 
    private HtmlHelper html; 
    public HomeLinks(HtmlHelper html) 
    { 
        this.html = html; 
    } 

    public String Index(String linkText) 
    { 
        return html.ActionLink(linkText, "Index", "Home"); 
    } 

    public String Details(String linkText, int id) 
    { 
        return html.ActionLink(linkText, "Details", "Home", new { id = id }); 
    } 
}

Une fois cette classe créée, on va ajouter une méthode au HtmlHelper pour pouvoir y accéder depuis notre vue :

public static class LinkHelper 
{ 
    public static HomeLinks HomeLinks(this HtmlHelper Html) 
    { 
        return new HomeLinks(Html); 
    } 

    public static AccountLinks AccountLinks(this HtmlHelper Html) 
    { 
        return new AccountLinks(Html); 
    } 
}

Notez que j’ai séparé les liens de chaque contrôleur dans des classes distinctes par soucis de clarté, mais ce n’est absolument pas obligatoire : vous pouvez si vous le souhaitez étendre directement le HtmlHelper par vos liens :

public static String Index(this HtmlHelper Html, String linkText) 
{ 
    return Html.ActionLink(linkText, "Index", "Home"); 
}

Pour pouvoir appeler vos méthodes depuis vos pages aspx, n’oubliez pas d’ajouter leur namespace dans le web.config :

<pages> 
  <namespaces> 
    <add namespace="MyMvcApp.LinkHelpers"/> 
  </namespaces> 
</pages>

Et voilà, plus besoin de faire passer de chaines de caractères en dur dans vos liens, vous pouvez utiliser ces méthodes avec des vrais noms et des paramètres typés !

Ainsi, les 2 lignes suivantes créeront le même lien :

<%= Html.ActionLink("Details pour l'id numero 5", "Details", "Home", new { id = 5 }  %> 
<%= Html.HomeLinks().Details("Details pour l'id numero 5", 5) %>