Добавление HtmlAttributes к шаблону - PullRequest
9 голосов
/ 20 октября 2011

Если я передаю атрибуты Html в шаблон, например:

@Html.DisplayFor(m => m.FirstName, new { htmlAttributes = new { @class = "orangetxt strongtxt" } })

В моем шаблоне, как мне вставить их в мой HTML:

<span @ViewData["htmlAttributes"]>@Model</span>

Это почти работает, но делает довольно странные вещи, поэтому я предполагаю, что это не тот путь.

Я понимаю, что могу сделать это с помощью метода расширения HtmlHelper, чтобы визуализировать полный HTML-элемент (в данном случае span) и таким образом передать атрибуты, но есть ли способ просто визуализировать атрибуты прямо в HTML-элемент, как в примере выше?

Ответы [ 4 ]

8 голосов
/ 20 октября 2011

Приведенный ниже метод расширения позволит мне преобразовать HtmlAttributes в строку:

    public static MvcHtmlString RenderHtmlAttributes<TModel>(
        this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
    {
        var attrbituesDictionary = new RouteValueDictionary(htmlAttributes);

        return MvcHtmlString.Create(String.Join(" ", 
            attrbituesDictionary.Select(
                item => String.Format("{0}=\"{1}\"", item.Key, 
                htmlHelper.Encode(item.Value)))));
    }

Затем, чтобы отобразить их в теге, я могу просто сделать это:

<span @Html.RenderHtmlAttributes(ViewData["htmlAttributes"])>@Model</span>
4 голосов
/ 14 августа 2014

Ответ Джерада Роуза хорош, но я столкнулся с несколькими проблемами:

  • Не преобразует подчеркивания в тире в именах атрибутов
  • Изящно не обрабатывает атрибуты без значений

Для решения первой проблемы используйте HtmlHelper.AnonymousObjectToHtmlAttributes.

Ниже моя модификация метода Джерада:

public static MvcHtmlString RenderHtmlAttributes(this HtmlHelper helper, object htmlAttributes)
{
        if (htmlAttributes == null) return new MvcHtmlString(String.Empty);
        var attrbituesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        return new MvcHtmlString(String.Join(" ", attrbituesDictionary.Select(item => string.IsNullOrEmpty((string)item.Value) ? String.Format("{0}", item.Key) : String.Format("{0}=\"{1}\"", item.Key, helper.Encode(item.Value)))));
}
1 голос
/ 20 октября 2011

Попробуйте вместо этого,

@Html.DisplayFor(m => m.FirstName, 
                 new { htmlAttributes = "class = orangetxt strongtxt"})

Это отобразит строку, тогда как ваша версия действительно сделала странные вещи, визуализированные { } как часть вывода.

0 голосов
/ 20 октября 2011

DisplayFor() используется для визуализации шаблона, соответствующего типу свойства.

Шаблоны отображения - это файлы .cshtml внутри папки / DisplayTemplates , которая, в свою очередь, находится внутри папки просмотра (то есть любой папки из Home, Shared или даже определенного контроллера).

Пример.

Если у вас есть String.cshtml шаблон, подобный этому, внутри / Views / Shared :

@model String

@if (string.IsNullOrEmpty(Model)) {
   <span>(no string)</span>
}
else {
   <span>@Model</span>
}

Каждый раз, когда вы вызываете DisplayFor() для строкового свойства:

DisplayFor(model => model.MyStringProperty);

Отображает шаблон в соответствии со значением строки. Вы можете быть более конкретным и поместить / DisplayTemplates в определенную папку View, и шаблон влияет на их только вызовы из этих представлений.

<Ч />

В вашем случае вы можете быть еще более конкретным и позвонить DisplayFor() с определенным шаблоном.

Предположим, у вас есть шаблон для определенного свойства, который называется MyPropertyTemplate.cshtml. Вы бы назвали DisplayFor() так:

DisplayFor(model => model.MyProperty, "MyPropertyTemplate");

И они, внутри этого шаблона вы можете иметь любые атрибуты HTML, которые вы хотите.

@model MyProperty

<span class="orangetxt strongtxt">@MyProperty.ToString()</span>
<Ч />

PS: когда он не находит шаблон, я думаю, он вызывает только model.Property.ToString() без дополнительного html.

К вашему сведению: EditorFor(), например, работает аналогичным образом, но использует папку / EditorTemplates .

...