我了解在 Razor 中,@Html 函数可以完成一些很棒的事情,比如为链接、输入框等生成 HTML 代码。
但是我不理解 DisplayFor 函数……
为什么要这样写:
@Html.DisplayFor(model => model.Title)
当我可以只写:
@Model.Title
我了解在 Razor 中,@Html 函数可以完成一些很棒的事情,比如为链接、输入框等生成 HTML 代码。
但是我不理解 DisplayFor 函数……
为什么要这样写:
@Html.DisplayFor(model => model.Title)
当我可以只写:
@Model.Title
Html.DisplayFor()
会渲染与属性类型匹配的DisplayTemplate。
如果它找不到任何一个,我想它会调用.ToString()
。
如果你不知道显示模板(display templates)是什么,它们是可以放置在控制器相关视图文件夹内的部分视图(partial view)。
例如:
如果在你的视图文件夹(例如 Home
或 Shared
)的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>
。
我认为主要的好处在于定义自己的显示模板(Display Templates)或使用数据注释(Data annotations)。
举例来说,如果你的标题是一个日期,那么你可以定义
[DisplayFormat(DataFormatString = "{0:d}")]
然后在每个页面上以一致的方式显示该值。否则,你可能需要在多个页面上自定义显示。这对于普通字符串帮助不大,但对于货币、日期、电子邮件、网址等有所帮助。
例如,电子邮件地址可以显示为链接,而不是普通字符串:
<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
DisplayFor
也适用于模板。你可以为你的 Model 编写一个模板,然后像这样做:
@Html.DisplayFor(m => m)
与@Html.EditorFor(m => m)
类似,DisplayFor
对于DRY原则非常有用,因此您不必为同一模型反复编写相同的显示逻辑。DisplayFor
也非常有用。例如,如果模型上的属性使用EmailAddress
数据注释进行了装饰,则DisplayFor
将其呈现为mailto:
链接。@Html.DisplayFor(m => m)
可以简化为 @Html.DisplayForModel()
。 - Brant Bobby<td>@Html.DisplayFor(modelItem=>item.Genre.Name)</td>
<td>@item.Genre.Name, This is direct from Item</td>
<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 Helper只是一个返回字符串的方法。该字符串可以表示任何类型的内容。例如,您可以使用HTML Helpers呈现标准HTML标记,如HTML和标记。您还可以使用HTML Helpers呈现更复杂的内容,例如选项卡或数据库数据的HTML表格。
要呈现更复杂的HTML,可以使用mvc自定义html模板或asp.net core中的自定义标签助手。
想通过一个场景来阐述为什么要使用DisplayFor而不是简单地使用模型值。 其他人提到的“DisplayFor使用显示模板进行渲染”的应用/意义,例如对于布尔值,这将显示一个复选框。
@Html.DisplayFor(model => model.IsBooleanTrue)
Html.DisplayFor(model => model.Title)和@Model.Title
之间的主要区别
Html.DisplayFor()
是一种强类型方法,可用于在视图中显示模型属性的值。它用于以适合属性数据类型的方式显示属性的值。它还将尊重应用于属性的任何DataAnnotations属性,并相应地显示属性。
@Model.Title
直接输出"Title"属性的值到视图。它不会使用任何格式或数据注释属性来显示该值。
总之,
@Html.DisplayFor(model => model.Title)
是一种更健壮和安全的显示属性的方式,因为它负责格式化和验证,而@Model.Title
是一种简单快捷的输出属性值的方式。