Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在DisplayName属性中插入换行符_Asp.net Mvc_Asp.net Mvc Viewmodel - Fatal编程技术网

Asp.net mvc 在DisplayName属性中插入换行符

Asp.net mvc 在DisplayName属性中插入换行符,asp.net-mvc,asp.net-mvc-viewmodel,Asp.net Mvc,Asp.net Mvc Viewmodel,在我的ViewModel中,有一个属性需要两行标签,但当我在DisplayName属性中放置时,HTML代码将打印到页面上,而不是解释为换行符。有没有办法让一个DisplayName在其中换行 视图: 我可以想出几个选择 1) 您可以使用@Html.Raw()。您可以将我输入的字符串替换为对字符串的引用 @Html.Raw("Gross Gallons <br /> (Max: 6,000)"); @Html.Raw(“总加仑(最大:6000)”; 1a)如果需要在Display

在我的ViewModel中,有一个属性需要两行标签,但当我在
DisplayName
属性中放置

时,HTML代码将打印到页面上,而不是解释为换行符。有没有办法让一个
DisplayName
在其中换行

视图:


我可以想出几个选择

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

@Html.Raw("Gross Gallons <br /> (Max: 6,000)");
@Html.Raw(“总加仑
(最大:6000)”;
1a)如果需要在DisplayName属性中设置它,那么可以尝试使用Html.Raw()但通过反射访问该值。(注意:我还没有尝试过,所以不知道是否可行)

2) 您可以使用css样式强制线条在您希望的位置进行换行


3) 你可以创建一个自定义扩展方法或自定义属性来实现这一点。

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

这并不漂亮,但是你可以使用
编辑模板
并创建所有模板都使用的
\u layout.cshtml
。然后使用此按钮拉/显示
DisplayName

<div class="form-group">
    <label for="@ViewData.ModelMetadata.PropertyName">
        @Html.Raw(ViewData.ModelMetadata.GetDisplayName())
    </label>
    @RenderBody()
    @Html.ValidationMessageFor(x => x)
</div>
有点离题,但通过这种方式,我可以将包装HTML封装在表单元素周围,因此视图中的表单非常简单,如下所示:

<fieldset>
  @Html.EditorFor(x => x.Email)
  @Html.EditorFor(x => x.Address1)
  @Html.EditorFor(x => x.Address2)
  @Html.EditorFor(x => x.City)
</fieldset>

@EditorFor(x=>x.Email)
@EditorFor(x=>x.Address1)
@EditorFor(x=>x.Address2)
@EditorFor(x=>x.City)
如果使用
LabelFor()
,另一个“可能”的解决方案是使用作为指南实现您自己的解决方案

替换

tag.SetInnerText(resolvedLabelText);


有一种简单的方法可以做到这一点-使用
\n
而不是

,并使用CSS使其工作

型号:

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

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

您还可以仅将更特定的样式附加到该标签,并仅为该类附加样式

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

您是否正在使用
@Html.EditorFor(…)
?是的,我正在使用
@Html.EditorFor()
显示输入选项。可能存在@MatthewVerstraete的重复项-在此处查看Darins答案-。基本上,在不使用黑客的情况下,您应该创建自己的标签创建Html帮助器,以便可以呈现未编码的Html。我只需要在任何地方使用它来代替标准的Html.LabelFor,这样您就不必跟踪哪些标签有Html,哪些标签没有Html。这会破坏使用
@Html.LabelFor
@Html.LabelFor不是@Html.Raw()@Html.LabelFor的目的。我知道Html助手之间的区别。在我的示例中,我使用
@Html.LabelFor()
,因为我希望代码生成
标记。移动到使用
@Html.Raw
一开始就否定了使用
@Html.LabelFor()
的全部理由。我甚至不确定您是否可以传入模型并获得
@Html.Raw
帮助程序要解析的
DisaplyName
属性。1:这将破坏使用
@Html.LabelFor
的目的。2:我真的不认为使用CSS黑客是有效的或合适的。3:我曾考虑过一个自定义扩展,但我希望有一个更简单的MVC解决方案。为什么要将标签和验证消息放在布局页面中,而不是放在所有其他表单标记所在的页面中?因为我只需要在那里做一次,而不是在其他地方每次都要做@Html.EditorFor()为我解决了这个问题。再说一次,它并不漂亮。:-)我不喜欢模板的内置编辑器,所以我通常会为所有类型编写自己的编辑器。因此,这对我来说不是问题,但是如果你对内置的很满意,那么就需要做很多额外的工作……但是将其放在布局模板中会导致页面无法显示表单数据,或者任何表单数据使用的模型不具有
displayproperty
属性,对吗?是和否,如果你使用EditorFor,它会出现在布局中。我只在标准表单中使用EditorFor<如果未使用
DisplayName
属性,code>GetDisplayName()
将返回
PropertyName
。但不确定这将如何与
EditorFor
一起使用。这很简单!谢谢
<fieldset>
  @Html.EditorFor(x => x.Email)
  @Html.EditorFor(x => x.Address1)
  @Html.EditorFor(x => x.Address2)
  @Html.EditorFor(x => x.City)
</fieldset>
tag.SetInnerText(resolvedLabelText);
tag.InnerHtml = resolvedLabelText;
[DisplayName("Gross Gallons\n(Max: 6,000)")]
public decimal GrossGallons { get; set; }
label { white-space: pre-wrap; }
@Html.LabelFor(m => m.GrossGallons, new { @class = "multiline-label" })