@ Html.DisplayFor的语法是什么?


223

我了解在Razor中,@ Html会做很多整洁的事情,例如为链接,输入生成HTML等。

但是我没有DisplayFor函数...

我为什么要写:

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

当我可以写的时候:

@Model.Title

Answers:


217

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

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


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


例:

如果您使用以下代码在views文件夹的文件夹(例如或)String.cshtml内创建一个名为view的视图:DisplayTemplatesHomeShared

@model string

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

然后@Html.DisplayFor(model => model.Title)(假设Title是字符串)将使用模板并显示<strong>Null string</strong>字符串是否为null或为空。


6
在大多数情况下,对原始类型使用DisplayFor似乎毫无意义。例如,即使时间部分没有用,DateTime也会显示日期/时间。如果可以在模型的属性属性中为DateTime类型指定格式字符串“ {0:d}”,则DisplayFor可能会更有用。
enorl76

6
@ enorl76可以。请参阅Daveo的答案
贝特朗·马伦

3
您可以将jQuery日期选择器添加到DateTime数据类型的EditorFor模板中,以始终在例如表单中显示日期选择器。
Zachary Scott

4
在我看来,一般来说使用它是过度工程的,但是当您要为某些模型属性格式化输出时,应该使用它。有用的问答,谢谢。全场+1。
罗宾·温斯洛

如果您有两个名称相同的型号怎么办?
哈利文斯顿2014年

77

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

例如,如果您的标题是日期,则可以定义

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

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

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

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

28

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:链接。


8
@Html.DisplayFor(m => m)也可以简化为公正@Html.DisplayForModel()
布兰特·鲍比

lamda表达式是什么(m => m)?前m代表什么?
Arcadian

1
第一个m是参数的名称
Sinaesthetic,2014年

1
@ magic-c0d3r第一个m是页面的Model对象。那就是在labmda表达式中使用的内容
Don Cheadle

4

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

    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

这是下面代码生成的HTML

<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

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

现在,如果同时要在类“ Genre”的一个语句中显示所有属性,则至少可以使用@ Html.DisplayFor()保存输入内容

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.