在我的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)
答案 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;