web-dev-qa-db-ja.com

Asp.Net MVCループでプレーンHTMLリンクをレンダリングする方法は?

ASP.NETMVCでHTMLリンクのリストをレンダリングしたいと思います。リンクは絶対的であり、設計中のWebサイトへの外部であることに注意してください。次のコードが機能します。

<% 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コントロールが欠落していますか?

16

あなたは何も見逃していませんが、良いアプローチは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>
15
Misha N.

タグビルダークラスを使用して、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属性を挿入するために文字列形式のパターンをいじくり回す必要がないことを意味します

27
Glenn Slaven

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> 

Update上記のリンクは無効になりましたが、ソースをダウンロードすると、リンク用に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));
    } 
3
Edward Wilde

私はむしろ使用したい

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

私にはやや「クリーン」に思えますが、あなたのアプローチも同様に良いと思います。

3
Max

いいと思います。単純なforeachは、MVCでリピーターの役割を果たします。

2
Mehdi Golchin

Htmlエンコーディングを回避するには、@ Html.Raw(url)を使用します。

1
Pravin Patil