2012-08-10 72 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类型。