这里有一些新手问题:
在强类型视图中,为什么:
@model MyProj.Models.User
为什么我们使用lambdas:?究竟是做什么的?为什么不只是model.Email?
1. @Html.DisplayNameFor(model => model.Email)
为什么这不起作用?我们没有称之为变量模型吗? (我知道我应该使用@html。()但是为什么模型不可识别?
2. users name is: @model.Name
为什么它适用于大写' M&#39 ;?我们用小写字母命名它吗?
3. users name is: Model.Name
谢谢!
答案 0 :(得分:6)
为什么我们使用lambdas:?究竟是做什么的?为什么不呢 model.Email?
DisplayNameFor以及所有其他*For helper methods正在利用lambda表达式参与Expression Trees的能力。
这个lambda表达式本身只是接受一个模型类型并返回一个String。但是获取显示名称需要更多信息。
在伪代码中,该方法正在执行:
1。)将lambda视为Expression
2.)解析表达式以获取属性的名称
3.)使用反射来获得该属性的DisplayNameAttribute
4.)提取值(如果存在),否则使用属性的名称
5.)使用显示名称或属性名称
如果不使用表达式树,您最终必须将属性名称作为字符串传递...而这很糟糕。这提供了一种使用反射而不使用magic strings的强类型方法。
为什么这不起作用?我们不是称变量模型吗? (我知道我 应该使用@html。(),但为什么模型不可识别?
@model
是special directive,Razor对此有不同的看法。它就像一个保留的关键字,与class
或int
没有任何区别。
为什么它使用大写的'M'?我们没有用更低的名字命名 情况?
Model
是视图中的属性,具有使用@model
指令定义的类型,并引用您的模型。如果不使用@model
指令,则其类型为dynamic
。