2009-10-26 2 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のエクステンダーを使用するためには、Web構成ファイルに次を追加する必要があります。

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

これにより、URLとテキストの両方にHTMLを挿入できます。 TagBuilderを使用するか、少なくともurlをエンコードする属性とテキストをエンコードするhtmlを忘れないでください。 – DamienG

+0

実際にDamienG、tnx。 –

+0

これは役に立ちました。私はこの[weblog](http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-declarative-razor-helper)も見つけました。 aspx)記事で同じことを説明していますが、Razorの構文を使用し、そこから再利用可能なライブラリを作成する方法を示しています。 – nwayve

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

オーチャードプロジェクトにはリンクビルダーメソッドを持つ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> 

を更新は、上記のリンクが有効でなくなっていますが、ソースをダウンロードした場合Linksの5つのオーバーロードがあるHtmlHelperExtensionsがあります。そのうちの1つは次のようになります。

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)を使用します。

関連する問題