我知道在Razor中,@Html做了一堆整洁的事情,比如为链接、输入生成HTML等。

但是我没有得到DisplayFor函数…

我为什么要写:

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

我只需要写:

@Model.Title

Html.DisplayFor()将呈现与属性类型匹配的DisplayTemplate。

如果找不到,我认为它会调用. tostring()。


如果你不了解显示模板,它们是部分视图,可以放在与控制器相关的视图文件夹中的DisplayTemplates文件夹中。


例子:

如果创建一个名为String的视图。在视图文件夹(例如Home或Shared)的DisplayTemplates文件夹中使用以下代码:

@model string

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

然后@Html。DisplayFor(model => model.Title)(假设Title是一个字符串)将使用模板,如果字符串为空,则显示<strong>Null string</strong>。


DisplayFor对于模板也很有用。你可以为你的模型写一个模板,并像这样做:

@Html.DisplayFor(m => m)

类似于@Html。EditorFor(m => m)。它对DRY主体很有用,这样你就不必为同一个模型反复编写相同的显示逻辑。

看看这个关于MVC2模板的博客。它仍然非常适用于MVC3:

http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


如果您的模型有数据注释,它也很有用。例如,如果模型上的属性用EmailAddress数据注释装饰,DisplayFor将把它呈现为mailto:链接。


我认为主要的好处是当你定义自己的显示模板,或使用数据注释。

例如,如果你的标题是一个日期,你可以定义

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

然后在每一页上,它都会以一致的方式显示值。否则,您可能必须在多个页面上自定义显示。所以它对普通字符串没有太大帮助,但它对货币、日期、电子邮件、url等有帮助。

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

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

一般来说,如果它只用于一个属性,那么生成的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助手渲染标准的HTML标签,如HTML和 标签。您还可以使用HTML helper来呈现更复杂的内容 例如标签条或数据库数据的HTML表。

为了呈现更复杂的html mvc自定义html模板或自定义标签助手在asp.net核心使用。


我想用一个场景详细说明为什么要使用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(不幸的是没有示例)


@Html之间的主要区别。DisplayFor(model => model. title)和@Model. title。标题

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

@ model。Title直接将“Title”属性的值输出到视图。它不使用任何格式或数据注释属性来显示值。

总之,

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