例如,在MVC应用程序中,我可以使用Html助手创建如下标签:
@Html.LabelFor(m => m.ProductName)我没有在任何地方声明变量"m“,但是IDE会自动找出我想要做的事情。IDE比我更了解我的代码,这有点令人不安。我想解决这个问题。
我主要想知道它是如何知道如何引用我的模型的。
编辑:感谢所有的答案。
因此,"Html“是HtmlHelper的一个实例。"Html“是ViewPage基类的成员。它的值在ViewPage基类的InitHelpers()方法中设置。HtmlHelper构造函数将ViewPage的ViewContext作为参数。ViewContext知道我使用的是什么模型。LabelFor是HtmlHelper类上的一个扩展方法。这就是为什么lambda表达式知道如何引用我的模型。
点是连在一起的。谢谢!
发布于 2010-12-10 22:12:33
您需要通读lambdas,但实际情况是,您传入了一个指向LabelFor方法的函数指针。因为Html是强类型的(HtmlHelper<TYourModelType>),并且LabelFor是像Func<TYourModelType, TValue>一样声明的,所以编译器(和集成开发环境)可以确定m是模型类型的实例,因此为成员提供了很好的集成开发环境下拉列表。
有时,人们发现比较您可以使用的其他语法选项很有帮助。例如,这将同样有效:
Html.LabelFor(SomePropertyMethod);
...
string SomePropertyMethod(TYourModelType model)
{
return model.SomeProperty;
}发布于 2010-12-10 22:12:22
在顶部针对您的视图声明的。
<%@ Page Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.EntryForm1>" %>因此,您的表单继承自ViewPage,它将理解T类型是什么。
发布于 2010-12-10 22:14:20
LabelFor的泛型参数与模型的类型相同:
Inherits="System.Web.Mvc.ViewPage<MyModel>"LabelFor的参数类型为:
Expression<Func<MyModel,TValue>>因此,编译器知道您将把一个MyModel对象传递给lambda。
https://stackoverflow.com/questions/4409566
复制相似问题