我知道在Razor中,@Html做了一堆整洁的事情,比如为链接、输入生成HTML等。
但是我没有得到DisplayFor函数…
我为什么要写:
@Html.DisplayFor(model => model.Title)
我只需要写:
@Model.Title
我知道在Razor中,@Html做了一堆整洁的事情,比如为链接、输入生成HTML等。
但是我没有得到DisplayFor函数…
我为什么要写:
@Html.DisplayFor(model => model.Title)
我只需要写:
@Model.Title
当前回答
@Html之间的主要区别。DisplayFor(model => model. title)和@Model. title。标题
displayfor()是一个强类型的方法,可用于在视图中显示模型属性的值。它用于以适合属性数据类型的方式显示属性的值。它还将尊重应用于该属性的任何DataAnnotations属性,并相应地显示该属性。
@ model。Title直接将“Title”属性的值输出到视图。它不使用任何格式或数据注释属性来显示值。
总之,
@Html。DisplayFor(model => model. title)是一种更健壮、更安全的显示属性的方法,因为它负责格式化和验证,而@Model. title是一种更安全的显示属性的方法。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:链接。
我想用一个场景详细说明为什么要使用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(不幸的是没有示例)
我认为主要的好处是当你定义自己的显示模板,或使用数据注释。
例如,如果你的标题是一个日期,你可以定义
[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核心使用。