2009-10-26 33 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)。

相关问题