Как сделать простые HTML-ссылки в цикле Asp.Net MVC? - PullRequest
16 голосов
/ 26 октября 2009

Я хотел бы отобразить список 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 здесь?

Ответы [ 6 ]

27 голосов
/ 25 марта 2010

Мне нравится реализовывать это так, как это делает инфраструктура 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 в ссылку

15 голосов
/ 26 октября 2009

Вы ничего не пропустили, но хорошим подходом является создание метода-расширителя в 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 голосов
/ 05 февраля 2012

Проект 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));
    } 
3 голосов
/ 26 октября 2009

Я бы лучше использовал

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

мне кажется несколько "чище", но я думаю, что ваш подход такой же хороший.

2 голосов
/ 26 октября 2009

Я думаю, это хорошо. Простой foreach выполняет роль повторителя в MVC.

1 голос
/ 24 февраля 2013

Чтобы избежать кодировки Html, используйте @ Html.Raw (url).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...