2

在 MVC 中,如果您想为属性创建编辑器或显示属性,您可以执行以下操作:

@Html.EditorFor(m=> m.MyModelsProperty);
@Html.DisplayFor(m=> m.MyModlesProperty);

为什么我们必须传递一个委托为什么我们不能直接传递模型的属性?例如:

@html.EditorFor(Model.MyModlesProperty);
4

3 回答 3

2

原因是元数据。您知道,您可以在模型上添加的所有属性,例如[Required], [DisplayName], [DisplayFormat], ... 所有这些属性都是从 lambda 表达式中提取的。如果您只是传递了一个值,那么助手将无法从中提取任何元数据。这只是一个虚拟值。

lambda 表达式允许分析模型上的属性并从中读取元数据。然后助手变得智能并且根据您指定的属性将采取不同的行动。

因此,通过使用 lambda 表达式,助手可以做更多的事情,而不仅仅是显示一些值。它能够格式化这个值,它能够验证这个值,......

于 2013-04-01T08:24:53.513 回答
1

我想补充一点,除了元数据和使 Html 帮助程序强类型为 Model 类型之外,还有另一个原因:

表达式允许您知道属性的名称,而无需将字符串硬编码到项目中。如果您检查由 MVC 生成的 HTML,您会看到您的输入字段已命名"ModelType_PropertyName",然后允许Model Binder创建复杂类型并传递给您的控制器操作,如下所示:

public ActionResult Foo(MyModel model) { ... }

另一个原因是Linq to SQL。表达式树是将 Lambda 转换为 SQL 查询所必需的魔法。因此,如果您要执行以下操作:

Html.DisplayFor(p => p.Addresses.Where(j => j.Country == "USA"))

并且您的 DbContext 仍处于打开状态,它将执行查询。

UPDATE
划出一个错误。你每天学习新的东西。

于 2013-04-01T08:46:33.847 回答
0

第一个示例提供了一个强类型参数。它迫使您从模型中选择一个属性。在第二个类型更松散的地方,您可以在其中放入任何内容,甚至是模型的无效属性。

编辑: 令人惊讶的是,我找不到强类型和松散类型的好例子/定义,所以我只给出一个简短的例子。

如果签名是,@html.EditorFor(string propertyName);那么我在输入名称时可能会打错字,直到运行时才会被发现。更糟糕的是,如果模型上的属性发生变化,它不会引发编译器错误,并且直到运行时才会再次被检测到。这可能会浪费大量时间调试问题。

另一方面,使用 lambda,如果模型的属性发生更改,您会收到编译器错误,如果您想编译程序,则必须修复它。编译时检查总是优于运行时检查。这消除了人为错误或疏忽的机会。

于 2013-04-01T08:29:03.830 回答