c#如何计算"m"来自何处(m => m.SomeProperty)?

Jim*_*Jim 4 c# asp.net-mvc lambda html-helper

例如,在MVC应用程序中,我可以使用Html帮助程序创建如下标签:

@Html.LabelFor(m => m.ProductName)
Run Code Online (Sandbox Code Playgroud)

我没有在任何地方声明变量"m",但IDE会自动确定我正在尝试做什么.IDE比我更了解我的代码,这有点令人不安.我想解决这个问题.

我大多想知道它是如何知道如何引用我的模型的.

编辑:谢谢你的所有答案.

所以,"Html"是HtmlHelper的一个实例."Html"是ViewPage基类的成员.它的值在ViewPage基类的InitHelpers()方法中设置.HtmlHelper构造函数将ViewPage的ViewContext作为参数.ViewContext知道我正在使用的模型.LabelFor是HtmlHelper类的扩展方法.这就是lambda表达式知道如何引用我的模型的原因.

点已连接.谢谢!

Kir*_*oll 12

你需要阅读lambdas,但是发生了什么是你传递了一个函数指针给LabelFor方法.因为Html是强类型(HtmlHelper<TYourModelType>)并且LabelFor被声明为Func<TYourModelType, TValue>,所以编译器(和IDE)可以确定它m是模型类型的实例,因此为成员提供了很好的IDE下拉列表.

有时候人们会发现比较其他语法选项很有帮助.例如,这同样有效:

Html.LabelFor(SomePropertyMethod);

...

string SomePropertyMethod(TYourModelType model) 
{
    return model.SomeProperty;
}
Run Code Online (Sandbox Code Playgroud)