2012-08-10 98 views
2

幾個新手問題在這裏:ASP.NET剃刀模式語法在視圖

在一個強類型的觀點,理由如下:

@model MyProj.Models.User 

爲什麼我們使用lambda表達式:這到底是什麼?爲什麼不只是model.Email?

1. @Html.DisplayNameFor(model => model.Email) 

爲什麼不這項工作?我們不是在稱可變模型嗎? (我知道我應該使用@html。(),但爲什麼不是模型識別?

2. users name is: @model.Name 

爲什麼它以大寫「M」工作?Didnt我們用小寫的名字呢?

3. users name is: Model.Name 

感謝

回答

6

爲什麼我們使用lambda表達式:究竟是什麼,爲什麼不只是 model.Email

DisplayNameFor以及所有其他*For helper methods正在利用lambda表達式參與Expression Trees的能力。

本身這個lambda表達式只是在模型類型和返回一個字符串。但是獲取顯示名稱需要更多信息。

在僞代碼中,該方法是這樣做的:

1)治療拉姆達作爲Expression
2.)解析表達式,以獲得屬性的名稱
3.)使用反射來獲取該DisplayNameAttribute該屬性
4.)提取的值,如果它存在,否則使用屬性
5.)的名稱生成用於使用任一的顯示名稱,或屬性名稱

W在所述屬性的標籤如果沒有使用表達式樹,你最終不得不以字符串的形式傳遞屬性名......並且只是很糟糕。這提供了一種使用反射的強類型方法,而不需要magic strings

爲什麼不能正常工作?我們不是在稱可變模型嗎? (我知道我 應該使用@html。(),但爲什麼不是模型識別?

@model是由剃刀區別對待一個special directive。這就像不超過class任何不同的一個保留關鍵字或int

爲什麼它以大寫 'M' 工作?Didnt我們命名它以較低的 情況?

Model是親在您的視圖中使用@model指令定義的類型,並引用您的模型。如果不使用@model指令,它將有一個dynamic類型。