如何在Asp.Net MVC循环中呈现纯HTML链接?

时间:2009-10-26 13:12:50

标签: asp.net-mvc hyperlink

我想在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控件吗?

6 个答案:

答案 0 :(得分:27)

我喜欢使用标记构建器类以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属性

答案 1 :(得分: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>

答案 2 :(得分:3)

我宁愿使用

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

对我来说似乎有点“干净”,但我觉得你的做法同样好。

答案 3 :(得分: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));
    } 

答案 4 :(得分:2)

我觉得这很好。一个简单的foreach在MVC中扮演转发器的角色。

答案 5 :(得分:1)

要避免使用Html编码,请使用@ Html.Raw(url)。