我想呈现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控制吗?
你是不是缺少什么,但良好的做法是对的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>
我想实现它的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链接的属性
我宁愿用
<td><a href="<%= item.Url %>">link</a></td>
似乎有点“清洁工”给我,但我觉得你的方法一样好。
果园项目有哪些有一个链接建设者方法的扩展的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>
更新上面的链接不再有效,但如果你下载源代码,你会发现其中有5个重载链接,其中一个看起来像这样HtmlHelperExtensions:
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));
}
我认为这是很好的。 一个简单的foreach做MVC中的中继器的作用。
为了避免HTML编码使用@ Html.Raw(URL)。