rkw*_*rkw 10 c# asp.net-mvc razor
从ASP.NET 2.0(VB)到MVC 3(C#),我对用于View的语法感到非常困惑.
@Html.LabelFor(m => m.UserName)
Run Code Online (Sandbox Code Playgroud)
那个m来自哪里?我唯一的猜测是它代表了传递给视图的模型.我尝试将m更改为c,它仍然可以正常工作.
语法的一部分是否涉及"=>"更多的MVC,C#或Razor元素?
jas*_*son 10
那是
m
从哪里来的?
它是lambda表达式中的参数.
我唯一的猜测是它代表了传递给视图的模型.我尝试将m更改为c,它仍然可以正常工作.
那是因为名字并不重要.它只是一个参数名称,它实际上并不是指任何现有变量.
语法的一部分是否涉及"=>"更多的MVC,C#或Razor元素?
它是C#,但LabelFor
使用编译器转换m => m.UserName
为提取构建标签所需的内容.
这是一个非常深刻的复杂主题.我建议你找一本你觉得很舒服的书(例如,深度的C#在这个问题上非常好)来了解更多.您想要阅读有关lambda表达式和表达式树的信息.
这是自C#3.0以来一直存在的语法技巧(我想;也许是3.5).
如果你在代码编写这(和你的Razor视图不会得到翻译成C#代码文件编译之前,所以这真的是在代码中),有两种可能的方式编译器可以将其根据上下文.
如果方法LabelFor()
需要委托,则将其编译为匿名方法.或者,如果方法需要System.Linq.Expressions.Expression<Func>
类型,则构造表达式树.这就是你的情况.
这种令人沮丧的语法的原因是表达式树包含足够的信息,(与Reflection结合使用)该LabelFor()
方法可以提取您所引用的实际属性.如果你只是简单地传递它LabelFor(Model.UserName)
,就没有足够的信息LabelFor()
来做到这一点.它只会从UserName
房产中获得价值.但现在它知道它来自哪里,并且可以使用更多的反射来浏览属性的属性.属性,如DisplayFormat
,Required
和其他.
该m
(或c
或其他)实际上是你的模型.LabelFor
是一个扩展方法,它只是将您的模型传递回Lambda表达式,以便整个表达式树技巧可以工作.你也可以写它LabelFor(x=>Model.UserName)
,但我认为它不会起作用(我没试过,也许它确实如此).
归档时间: |
|
查看次数: |
12138 次 |
最近记录: |