Подтвердить что ты не робот

Как визуализировать простые 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 здесь?

4b9b3361

Ответ 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).