2011-06-15 133 views
200

据我所知,在剃刀,@Html做了一堆整齐的东西,比如生成HTML中的链接,输入等什么是@ Html.DisplayFor语法?

但我没有得到DisplayFor功能...

我为什么会写:

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

时,我可以只写:

@Model.Title 

回答

192

Html.DisplayFor()都会使该公关匹配DisplayTemplate operty的类型。如果它找不到任何,我想它调用.ToString()


如果您不知道的显示模板做什么,他们可以放在一个文件夹DisplayTemplates关联到一个控制器视图文件夹中的部分观点。


例子:

如果你创建了一个名为String.cshtml您的意见文件夹(如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>

+5

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

+5

@ enorl76你可以。请参阅[Daveo的答案](http://stackoverflow.com/a/6365687/212384)。 – 2012-01-11 10:14:14

+3

您可以将一个jQuery日期选择器添加到EditorFor模板中以便DateTime数据类型始终在窗体中显示日期选择器,例如。 – 2012-04-18 01:54:56

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

+6

'@ Html.DisplayFor(m => m)'也可以简化为'@ Html.DisplayForModel()'。 – 2013-01-31 21:00:43

+0

什么是lamda表达式(m => m)?第一个m代表什么? – Arcadian 2013-10-21 14:26:34

+1

第一个m是参数的名称 – Sinaesthetic 2014-01-04 18:23:28

70

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

因此,举例来说,如果你的标题是一个日期,你可以定义

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

,然后在每个页面上会显示以一致的方式的价值。否则,您可能需要在多个页面上自定义显示。所以它对简单的字符串没有多大帮助,但它对货币,日期,电子邮件,网址等有帮助。

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

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

寻找我自己的答案了一段时间后,我能找到的东西。 一般来说,如果我们使用它只是一个属性出现相同的,即使我们做生成的HTML 下面是生成的HTML例如“查看源文件”,当我想只显示我的类名属性

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

这是从下面的代码

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

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

生成的HTML同时现在如果我想显示在一个声明中的所有属性为我在这种情况下类“流派”, 我可以使用@Html。 DisplayFor()保存在我的打字上,至少可以保存

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

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

等取决于属性的数量。