在DisplayName属性中插入换行符

时间:2014-03-12 14:26:04

标签: asp.net-mvc asp.net-mvc-viewmodel

在我的ViewModel中有一个需要2行标签的属性,但当我在<br />属性中放置DisplayName时,HTML代码将打印到页面而不是被解释为换行符。有没有办法让DisplayName有换行符?

查看:

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

视图模型:

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

输出尝试获取:

Gross Gallons
(Max: 6,000)

5 个答案:

答案 0 :(得分:15)

有一种简单的方法可以执行此操作 - 使用\n代替<br />,并使用CSS使其正常工作。

型号:

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

CSS:

label { white-space: pre-wrap; }

我建议尽可能使CSS选择器具体化,以免捕获其他标签(如果你在其他地方手工使用标签,你的源代码可能包含空格)。例如,在bootstrap中,我会将此应用于label.control-label

您还可以仅为该标签附加更具体的样式,并仅为该类设置样式。

@Html.LabelFor(m => m.GrossGallons, new { @class = "multiline-label" })

答案 1 :(得分:0)

我可以想到几个选择。

1)你可以使用@ Html.Raw()。您可以使用对字符串的引用替换我输入的字符串。

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

1a)如果您需要在DisplayName属性中设置它,那么您可以尝试使用Html.Raw()但通过反射访问该值。 (注意:我没试过这个,所以不知道是否可能)

2)您可以使用CSS样式强制线条包裹到您想要的位置。

3)您可以创建自定义扩展方法或自定义属性来为您执行此操作。

答案 2 :(得分:0)

你可以使用@ Html.Raw(),我认为这是最简单的方法。

答案 3 :(得分:0)

它不漂亮,但您可以使用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>

答案 4 :(得分:0)

如果使用LabelFor(),另一个“可能的”解决方案是使用original source作为指南来实现您自己的解决方案。

替换

tag.SetInnerText(resolvedLabelText);

tag.InnerHtml = resolvedLabelText;