语法问题:@ Html.LabelFor(m => m.UserName)

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表达式和表达式树的信息.


Vil*_*lx- 8

这是自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),但我认为它不会起作用(我没试过,也许它确实如此).