Вставка разрывов строк в атрибуты DisplayName

В моей ViewModel есть свойство, для которого требуется двухстрочная метка, но когда я помещаю <br /> в атрибут DisplayName, HTML-код печатается на странице, а не интерпретируется как разрыв строки. Есть ли способ заставить DisplayName иметь в нем разрыв строки?

Вид:

    <tr>
        <td>
            @Html.LabelFor(m => m.GrossGallons)
        </td>
        <td>
        </td>
    </tr>

ViewModel:

    [DisplayName("Gross Gallons <br /> (Max: 6,000)")]
    public decimal GrossGallons { get; set; }

Вывод при попытке получить:

Gross Gallons
(Max: 6,000)

person Matthew Verstraete    schedule 12.03.2014    source источник
comment
Вы используете @Html.EditorFor(...)?   -  person mxmissile    schedule 12.03.2014
comment
Да, я использую @Html.EditorFor() для отображения параметра ввода.   -  person Matthew Verstraete    schedule 12.03.2014
comment
@MatthewVerstraete - взгляните на ответ Дарина здесь - stackoverflow.com/questions/10478454/. По сути, не прибегая к хакам, вы должны создать свой собственный ярлык, создающий помощник Html, чтобы вы могли отображать незакодированный Html. Я бы просто использовал это везде вместо стандартного Html.LabelFor, поэтому вам не нужно отслеживать, какие ярлыки имеют html, а какие нет.   -  person Tommy    schedule 12.03.2014


Ответы (5)


Есть простой способ сделать это — использовать \n вместо <br /> и использовать CSS, чтобы заставить его работать.

Модель:

[DisplayName("Gross Gallons\n(Max: 6,000)")]
public decimal GrossGallons { get; set; }

CSS:

label { white-space: pre-wrap; }

Я бы порекомендовал сделать селектор CSS как можно более конкретным, чтобы не перехватывать другие метки (на случай, если вы используете метки вручную в другом месте, где ваш исходный код может содержать пробелы). Например, в начальной загрузке я бы применил это к label.control-label.

Вы также можете прикрепить более конкретный стиль только к этой метке и задать стиль только для этого класса.

@Html.LabelFor(m => m.GrossGallons, new { @class = "multiline-label" })
person Richard    schedule 12.03.2014
comment
Это было просто! Спасибо! - person Chris Patterson; 14.08.2015

Я могу придумать несколько вариантов.

1) Вы можете использовать @Html.Raw(). Вы можете заменить введенную мной строку ссылкой на строку.

@Html.Raw("Gross Gallons <br /> (Max: 6,000)");

1a) Если вам нужно установить его в атрибуте DisplayName, вы можете попробовать использовать Html.Raw(), но получить доступ к значению через отражение. (Примечание: я не пробовал, поэтому не знаю, возможно ли это)

2) Вы можете использовать стиль css, чтобы заставить строку переноситься туда, куда вы хотите.

3) Вы можете создать собственный метод расширения или собственный атрибут, чтобы сделать это за вас.

person ken4z    schedule 12.03.2014
comment
1: Это противоречит цели использования @Html.LabelFor. 2: Я действительно не думаю, что использование взлома CSS было бы эффективным или правильным. 3: Я думал о собственном расширении, но я надеялся, что может быть более простое решение MVC. - person Matthew Verstraete; 12.03.2014

вы можете использовать @Html.Raw(), я думаю, что это самый простой способ.

person Sporule    schedule 12.03.2014
comment
Это противоречит цели использования @Html.LabelFor. - person Matthew Verstraete; 12.03.2014
comment
@Html.LabelFor не @Html.Raw() - person Sporule; 12.03.2014
comment
@Html.LabelFor — это ‹label for=›‹/label› - person Sporule; 12.03.2014
comment
Я знаю разницу между слишком HTML-хелперами. В моем примере я использую @Html.LabelFor(), потому что я хочу, чтобы код генерировал тег <label />. Переход к использованию @Html.Raw в первую очередь сводит на нет всю причину использования @Html.LabelFor(). Я даже не уверен, что вы могли бы передать модель и получить атрибут DisaplyName для анализа помощником @Html.Raw. - person Matthew Verstraete; 12.03.2014

Это некрасиво, но вы можете использовать EditorTemplates и создать _layout.cshtml, который будут использовать все ваши шаблоны. Затем используйте это, чтобы вытащить/отобразить DisplayName:

<div class="form-group">
    <label for="@ViewData.ModelMetadata.PropertyName">
        @Html.Raw(ViewData.ModelMetadata.GetDisplayName())
    </label>
    @RenderBody()
    @Html.ValidationMessageFor(x => x)
</div>

Серьезным недостатком этого является то, что вам придется создавать EditorTemplates для каждого из ваших типов, как этот пример шаблона string.cshtml:

@model string
@{
    Layout = "_Layout.cshtml";
}
@Html.TextBoxFor(x => x, new { @class="form-control" })

Немного не по теме, но этот маршрут позволяет мне инкапсулировать HTML-оболочку вокруг элементов формы, поэтому мои формы в представлениях в итоге получаются очень простыми, как это:

<fieldset>
  @Html.EditorFor(x => x.Email)
  @Html.EditorFor(x => x.Address1)
  @Html.EditorFor(x => x.Address2)
  @Html.EditorFor(x => x.City)
</fieldset>
person mxmissile    schedule 12.03.2014
comment
Почему вы помещаете метку и сообщение проверки на страницу макета, а не прямо на страницу, где находится вся остальная разметка формы? - person Matthew Verstraete; 12.03.2014
comment
Потому что мне нужно сделать это только один раз, а не каждый раз, как везде. @Html.EditorFor() позаботится об этом за меня. - person mxmissile; 12.03.2014
comment
Опять же, это не красиво. :-) Мне не нравятся встроенные шаблоны EditorFor, поэтому обычно я все равно пишу свои собственные для всех типов. Поэтому для меня это не проблема, однако, если у вас все в порядке со встроенным, тогда много дополнительной работы.... - person mxmissile; 12.03.2014
comment
Но размещение этого в шаблоне макета испортит страницы, на которых не отображаются данные формы или какие-либо данные формы, использующие модель, не имеющую атрибута DisplayPropery, верно? - person Matthew Verstraete; 12.03.2014
comment
Да и нет, если вы используете EditorFor, он попадет в материал Layout. Я использую EditorFor только внутри стандартной формы. GetDisplayName() возвращает PropertyName, если атрибут DisplayName не используется. - person mxmissile; 12.03.2014

При использовании LabelFor() другим «возможным» решением является реализация собственного с использованием оригинальный источник в качестве руководства.

Заменять

tag.SetInnerText(resolvedLabelText);

с участием

tag.InnerHtml = resolvedLabelText;
person mxmissile    schedule 12.03.2014
comment
Не знаю, как это будет работать с EditorFor. - person mxmissile; 12.03.2014