2011-06-15 52 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 

等取決於屬性的數量。