Как визуализировать простые HTML-ссылки в цикле Asp.Net MVC?
Я хотел бы отобразить список ссылок HTML в ASP.NET MVC. Обратите внимание, что ссылки являются абсолютными и внешними для создаваемого веб-сайта. Работает следующий код:
<% 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 здесь?
Ответы
Ответ 1
Вам ничего не хватает, но хороший подход заключается в создании метода расширений на 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>
Ответ 2
Мне нравится реализовать его так, как это делает инфраструктура 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
Я предпочел бы использовать
<td><a href="<%= item.Url %>">link</a></td>
кажется мне "чище", но я думаю, что ваш подход так же хорош.
Ответ 4
Проект 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));
}
Ответ 5
Я думаю, это хорошо. Простой foreach выполняет роль ретранслятора в MVC.
Ответ 6
Чтобы избежать кодирования Html, используйте @Html.Raw(url).