在razor视图中使用Html.DisplayFor应用css类

use*_*862 13 .net c# asp.net-mvc razor

在剃刀视图中,我使用模型来渲染标签

 @Html.LabelFor(model => model.MyName, htmlAttributes: new { @class = "control-label col-md-6" })
Run Code Online (Sandbox Code Playgroud)

现在我想使用它的值而不是数据注释attr.值,所以我尝试使用DisplayFor之类的

@Html.DisplayFor(model => model.MyName, new { @class = "control-label col-md-6" })
Run Code Online (Sandbox Code Playgroud)

这个css类control-label col-md-6不适用.为什么?

小智 31

区别在于 @Html.LabelFor辅助函数呈现<label></label>标记,而@Html.DisplayFor辅助函数不呈现任何html标记,而是呈现纯文本.例如,以下代码:

@Html.DisplayFor(model => model.MyName, new { @class = "control-label col-md-6" })
Run Code Online (Sandbox Code Playgroud)

返回原始文本:

Martin
Run Code Online (Sandbox Code Playgroud)

考虑到MyName的值为"Martin".和代码:

@Html.LabelFor(model => model.MyName, htmlAttributes: new { @class = "control-label col-md-6" })
Run Code Online (Sandbox Code Playgroud)

将返回:

<label class="control-label col-md-6">Martin</label>
Run Code Online (Sandbox Code Playgroud)

考虑一下差异.

使用以下(如果你想使用@ Html.DisplayFor):

<span class"control-label col-md-6">@Html.DisplayFor(model => model.MyName)</span>
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是正确的 - 不会LabelFor返回属性的*name*,而不是值"Martin"? (3认同)
  • 需要=那里.<span class ="control-label col-md-6"> @ Html.DisplayFor(model => model.MyName)</ span> (2认同)
  • 同意@msulis。LabelFor 不会返回任何字段值,它将返回属性名称。 (2认同)

Chr*_*att 13

DisplayFor不像其他*For助手一样工作.就像EditorFor,它被称为"模板助手".换句话说,它呈现的内容由可以修改的模板控制.重要的是,对于这两种方法,如果您在MSDN中查找其文档,您将看到htmlAttributes与其他帮助程序正常对应的参数,而是指additionalViewData这两个.这是因为它们的输出再次受到基本上视图的控制ViewData.

此外,DisplayFor特别是,默认模板几乎只输出值,没有HTML.例如,如果传递字符串属性,则输出将是该字符串的值,而不是其他任何内容.因此,没有什么可以将HTML属性绑定到,即使你可以传递它们.

如果您想要执行您要执行的操作,则必须创建自定义显示模板.这可以通过添加后命名视图进行类型(例如String,Boolean,Byte等等)或成员的DataType枚举(CreditCard,EmailAddress等), Views\Shared\DisplayTemplates.例如,如果您创建了一个视图Views\Shared\DisplayTemplates\String.cshtml,那么当您DisplayFor使用类型属性调用时string,该视图将用于渲染它.然后,您可以将值直接包装在您选择的某些HTML中,并ViewData用于应用适当的HTML属性.例如:

<span class="@ViewData["class"]">@ViewData.TemplateInfo.FormattedModelValue</span>
Run Code Online (Sandbox Code Playgroud)