关于asp.net MVC 3:@ Html.DisplayFor的语法是什么?

What is the @Html.DisplayFor syntax for?

我了解在Razor中,@ Html会执行许多整洁的操作,例如为链接,输入生成HTML等。

但是我没有DisplayFor函数...

我为什么要写:

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

当我可以写的时候:

1
@Model.Title

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

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

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

例:

如果在视图文件夹的DisplayTemplates文件夹(例如HomeShared)中创建名为String.cshtml的视图,则使用以下代码:

1
2
3
4
5
6
7
8
@model string

@if (string.IsNullOrEmpty(Model)) {
   Null string
}
else {
   @Model
}

然后@Html.DisplayFor(model => model.Title)(假设Title是字符串)将使用模板,并且如果字符串为null或为空,则显示Null string


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

因此,例如,如果标题是日期,则可以定义

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

然后将在每个页面上以一致的方式显示该值。否则,您可能必须自定义多个页面上的显示。因此,它对纯字符串没有太大帮助,但对货币,日期,电子邮件,URL等却没有帮助。

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

1
@ViewData.TemplateInfo.FormattedModelValue


DisplayFor对于模板化也很有用。您可以为模型编写模板,然后执行以下操作:

1
@Html.DisplayFor(m => m)

@Html.EditorFor(m => m)相似。这对于DRY主体很有用,这样您就不必为相同的模型一遍又一遍地编写相同的显示逻辑。

看一下有关MVC2模板的博客。它仍然非常适用于MVC3:

ASP.NET MVC 2 Templates

如果您的模型具有数据注释,这也很有用。例如,如果模型的属性装饰有EmailAddress数据注释,则DisplayFor会将其呈现为mailto:链接。


在为自己寻找答案一段时间后,我可以找到一些东西。
通常,如果我们仅将其用于一个属性,那么即使我们对生成的HTML进行"查看源代码",它也会看起来相同
下面是生成的HTML,例如,当我只想显示我的班级的Name属性时

1
2
3
4
5
6
    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

这是下面代码生成的HTML

1
2
3
4
5
6
7
<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

<td>
@item.Genre.Name, This is direct from Item
</td>

现在,如果同时要在这种情况下为类"流派"在一条语句中显示所有属性,
我可以使用@ Html.DisplayFor()至少保存我的输入内容

我可以编写@ Html.DisplayFor(modelItem => item.Genre)来代替为Genre的每个属性编写单独的语句,如下所示

1
2
3
@item.Genre.Name
@item.Genre.Id
@item.Genre.Description

等等,取决于属性的数量。