2009-10-26 1 views
16

Je voudrais rendre une liste de liens HTML dans ASP.NET MVC. Notez que les liens sont absolus et externe au site Web en cours de conception. Le code suivant fonctionne:Comment rendre des liens HTML simples dans la boucle Asp.Net MVC?

<% foreach (var item in Model) { %> 

    <tr> 
     <td> 
      <%= Html.Encode(item.Id) %> 
     </td> 
     <td> 
      <%= String.Format("<a href=\"{0}\">link</a>", item.Url) %> 
     </td> 
    </tr> 

<% } %> 

Mais je me demande si c'est vraiment la bonne approche. Est-ce que je manque un contrôle MVC évident ici?

Répondre

15

ne vous manque rien, mais une bonne approche est de créer la méthode d'extension sur HtmlHelper:

public static class HtmlHelpers 
    { 

     public static string SimpleLink(this HtmlHelper html, string url, string text) 
     { 
      return String.Format("<a href=\"{0}\">{1}</a>", url, text); 
     } 

    } 

alors vous pouvez l'utiliser comme ceci:

<tr> 
     <td> 
      <%= Html.Encode(item.Id) %> 
     </td> 
     <td> 
      <%= Html.SimpleLink(item.Url,item.Text) %> 
     </td> 
    </tr> 

[modifier] J'ai oublié d'ajouter. Pour utiliser cette extension HtmlHelper toute application que vous devez ajouter ce qui suit dans le fichier de configuration Web:

<system.web> 
     <pages> 
     <namespaces> 
      <!-- leave rest as-is --> 
      <add namespace="theNamespaceWhereHtmlHelpersClassIs"/> 
     </namespaces> 
     </pages> 
    </system.web> 
+3

Cela permet l'injection HTML à la fois dans l'URL et dans le texte. Utilisez TagBuilder ou rappelez-vous au moins d'attribuer l'encodage de l'URL et html encoder le texte. – DamienG

+0

En effet DamienG, tnx. –

+0

C'était utile. J'ai également trouvé ce [weblog] (http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-methods-and-declarative-razor-helper. aspx) article décrivant la même chose mais utilisant la syntaxe Razor et montrant comment créer une bibliothèque réutilisable à partir de celle-ci. – nwayve

2

Je pense que c'est bon. Un simple foreach fait le rôle de répéteur dans MVC.

3

Je préfère utiliser

<td><a href="<%= item.Url %>">link</a></td> 

semble un peu plus « propre » pour moi, mais je pense que votre approche tout aussi bon.

26

J'aime à le mettre en œuvre la façon dont le framework MVC fait, en utilisant la classe constructeur de balise. De cette façon, je peux passer à travers le paramètre htmlAttributes pour ajouter des choses comme la classe ou d'autres attributs:

public static MvcHtmlString HtmlLink(this HtmlHelper html, string url, string text, object htmlAttributes) 
{ 
TagBuilder tb = new TagBuilder("a"); 
tb.InnerHtml = text; 
tb.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
tb.MergeAttribute("href", url); 
return MvcHtmlString.Create(tb.ToString(TagRenderMode.Normal)); 
} 

peut sembler overkill juste pour générer un lien, mais cela signifie que vous ne devez pas perdre son temps avec des motifs de format de chaîne pour insérer des attributs HTML supplémentaires sur le lien

3

Le projet Orchard a une classe d'extensions HtmlHelper qui a une méthode de création de liens.

Voir: HtmlHelperExtensions.Link()

http://orchard.codeplex.com/SourceControl/changeset/view/dbec3d05e6d1#src%2fOrchard%2fMvc%2fHtml%2fHtmlHelperExtensions.cs

Permet à l'utilisation suivante:

<li>@Html.Link(Model.Path, Model.Title)</li> 

Mise à jour Le lien ci-dessus est plus valide, mais si vous téléchargez la source, vous trouverez HtmlHelperExtensions qui a 5 surcharges pour les liens, dont l'un ressemble à ceci:

public static IHtmlString Link(this HtmlHelper htmlHelper, string linkContents, string href, IDictionary<string, object> htmlAttributes) { 
     var tagBuilder = new TagBuilder("a") { InnerHtml = htmlHelper.Encode(linkContents) }; 
     tagBuilder.MergeAttributes(htmlAttributes); 
     tagBuilder.MergeAttribute("href", href); 
     return new HtmlString(tagBuilder.ToString(TagRenderMode.Normal)); 
    } 
1

Pour éviter le codage Html, utilisez @ Html.Raw (url).

Questions connexes