2009-10-26 31 views
16

我想呈現ASP.NET MVC中的HTML鏈接列表。請注意,鏈接是絕對的,外部到正在設計的網站。下面的代碼工程:如何在Asp.Net MVC循環中呈現純HTML鏈接?

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

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

<% } %> 

但我想知道是否真的是正確的做法。我在這裏錯過了一些明顯的MVC控制?

回答

15

您不會錯過任何東西,但良好的做法是對的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); 
     } 

    } 

那麼你可以使用它像這樣:

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

[編輯]我忘了補充。爲了使用整個應用此的HtmlHelper擴展需要添加以下內容的網絡配置文件:

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

這允許在URL和文本中的HTML注入。使用TagBuilder或者至少記得對url進行屬性編碼,並且html將文本編碼。 – DamienG 2010-04-13 19:11:33

+0

確實DamienG,tnx。 – 2010-04-14 08:12:55

+0

這很有幫助。我也發現這個[博客](http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-claclarative-razor-helper。 aspx)文章描述相同的事物,但使用Razor語法並顯示如何從中創建可重用的庫。 – nwayve 2011-12-28 16:37:56

2

我認爲這很好。一個簡單的foreach在MVC中扮演重播器的角色。

3

我寧願用

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

似乎有點「清潔工」給我,但我覺得你的方法一樣好。

26

我想實現它的MVC框架做它的方式,使用標記生成器類。這樣我可以通過htmlAttributes參數添加東西​​像類或其他屬性:

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)); 
} 

可能看起來像矯枉過正只是產生一個鏈接,但它意味着你不必用字符串格式模式渣土約在鏈接上插入其他HTML屬性

3

Orchard項目有一個HtmlHelper擴展類,它具有鏈接構建器方法。

見:HtmlHelperExtensions.Link()

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

允許以下用法:

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

更新上面的鏈接不再有效,但如果你下載源代碼,你會發現HtmlHelperExtensions有5個重載鏈接,其中一個看起來像這樣:

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

爲了避免Html編碼使用@ Html.Raw(url)。

相關問題