@Html.DisplayFor语法的作用是什么?

253

我了解在 Razor 中,@Html 函数可以完成一些很棒的事情,比如为链接、输入框等生成 HTML 代码。

但是我不理解 DisplayFor 函数……

为什么要这样写:

@Html.DisplayFor(model => model.Title)

当我可以只写:

@Model.Title
6个回答

248

Html.DisplayFor()会渲染与属性类型匹配的DisplayTemplate。

如果它找不到任何一个,我想它会调用.ToString()


如果你不知道显示模板(display templates)是什么,它们是可以放置在控制器相关视图文件夹内的部分视图(partial view)。


例如:

如果在你的视图文件夹(例如 HomeShared)的DisplayTemplates文件夹内创建了一个名为String.cshtml的视图,并加入以下代码:

@model string

@if (string.IsNullOrEmpty(Model)) {
   <strong>Null string</strong>
}
else {
   @Model
}

假设Title是一个字符串,那么@Html.DisplayFor(model => model.Title)会使用这个模板,如果字符串是 null 或空,则显示<strong>Null string</strong>


7
在大多数情况下,对于基本类型使用DisplayFor似乎是毫无意义的。例如,即使时间部分无用,DateTime也会显示日期/时间。如果您可以在模型的属性上指定一个格式字符串“{0:d}”来表示DateTime类型,则DisplayFor可能会更有用。 - enorl76
6
你可以看一下Daveo的回答 - Bertrand Marron
3
你可以为 DateTime 数据类型的 EditorFor 模板添加一个 jQuery 日期选择器,以便在表单中始终显示日期选择器。 - Zachary Scott
4
对我来说,普遍情况下使用它似乎有点过度工程化,但当您想要格式化特定模型属性的输出时应该使用它。感谢这些有用的问题和答案,大家都很棒。给大家加1赞。 - Robin Winslow
@BertrandMarron 嗨,我知道这是一个旧帖子,但我想知道你是否可以提供给我们参考资料?谢谢! - digawp
显示剩余2条评论

81

我认为主要的好处在于定义自己的显示模板(Display Templates)或使用数据注释(Data annotations)。

举例来说,如果你的标题是一个日期,那么你可以定义

[DisplayFormat(DataFormatString = "{0:d}")]

然后在每个页面上以一致的方式显示该值。否则,你可能需要在多个页面上自定义显示。这对于普通字符串帮助不大,但对于货币、日期、电子邮件、网址等有所帮助。

例如,电子邮件地址可以显示为链接,而不是普通字符串:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>

32

DisplayFor 也适用于模板。你可以为你的 Model 编写一个模板,然后像这样做:

@Html.DisplayFor(m => m)
@Html.EditorFor(m => m)类似,DisplayFor对于DRY原则非常有用,因此您不必为同一模型反复编写相同的显示逻辑。
请查看此MVC2模板的博客。它仍然非常适用于MVC3:http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/ 此外,如果您的模型具有数据注释,则DisplayFor也非常有用。例如,如果模型上的属性使用EmailAddress数据注释进行了装饰,则DisplayFor将其呈现为mailto:链接。

9
@Html.DisplayFor(m => m) 可以简化为 @Html.DisplayForModel() - Brant Bobby
1
什么是lambda表达式(m=>m)?第一个m代表什么? - Arcadian
2
第一个m是参数的名称 - Sinaesthetic
2
@magic-c0d3r 第一个 m 是页面的 Model 对象。这是 lambda 表达式中使用的对象。 - Don Cheadle

4
通常情况下,如果它只用于一个属性,生成的 HTML 看起来是相同的。例如,以下代码:
<td>@Html.DisplayFor(modelItem=>item.Genre.Name)</td>         
<td>@item.Genre.Name, This is direct from Item</td>

生成此HTML
<td>myClassNameProperty</td>
<td>myClassNameProperty, This is direct from Item</td>

同时,如果我想一次性显示“类型”类中的所有属性,可以使用@Html.DisplayFor()来节省输入时间。

例如,我可以写@Html.DisplayFor(modelItem=>item.Genre),而不是为“类型”类中的每个属性单独编写语句,如下所示:

@item.Genre.Name
@item.Genre.Id
@item.Genre.Description

根据属性数量等情况,可以进行其他操作。

第三方编辑

来自html-helpers文档

HTML Helper只是一个返回字符串的方法。该字符串可以表示任何类型的内容。例如,您可以使用HTML Helpers呈现标准HTML标记,如HTML和标记。您还可以使用HTML Helpers呈现更复杂的内容,例如选项卡或数据库数据的HTML表格。

要呈现更复杂的HTML,可以使用mvc自定义html模板asp.net core中的自定义标签助手


0

想通过一个场景来阐述为什么要使用DisplayFor而不是简单地使用模型值。 其他人提到的“DisplayFor使用显示模板进行渲染”的应用/意义,例如对于布尔值,这将显示一个复选框。

@Html.DisplayFor(model => model.IsBooleanTrue)

附注:EditorFor 将显示相同的未禁用复选框。
文档:https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.html.displayextensions.displayfor?view=aspnet-mvc-5.2(不幸的是,其中没有示例)。

0

Html.DisplayFor(model => model.Title)@Model.Title之间的主要区别

Html.DisplayFor()是一种强类型方法,可用于在视图中显示模型属性的值。它用于以适合属性数据类型的方式显示属性的值。它还将尊重应用于属性的任何DataAnnotations属性,并相应地显示属性。

@Model.Title直接输出"Title"属性的值到视图。它不会使用任何格式或数据注释属性来显示该值。

总之,

@Html.DisplayFor(model => model.Title)是一种更健壮和安全的显示属性的方式,因为它负责格式化和验证,而@Model.Title是一种简单快捷的输出属性值的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接