3

让我们看看这一行:@Html.LabelFor(m => m.UserName) 它在带有这一行的页面上:@model CurrencyMvc.Models.RegisterModel

我假设当页面视图呈现时 LabelFor 会自动调用并引用所描述的模型,并且 Lambda 函数会告诉它如何从模型中获取所需的信息?

我不清楚为什么我们在可以传递实际值 egmUsername 时传递一个函数。

哦,当这个助手被调用时,“m”是从哪里来的?

4

3 回答 3

6

剃须刀页面有 2 个类(第二个派生自第一个):

  1. System.Web.Mvc.WebViewPage
  2. System.Web.Mvc.WebViewPage<T>

因此,当您通过指定模型来使用强类型视图时,您的视图派生自泛型版本并且Html属性是泛型的HtmlHelper<TModel>。由于始终使用强类型视图是一种很好的做法,因此我将不再谈论第一类,因为它没有兴趣。

我们看一下LabelFor扩展方法的签名:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression
)
{
    ...
}

从这个定义可以看出,该LabelFor方法是HtmlHelper<TModel>类的扩展方法,它接受 1 个参数。此方法仅在您具有强类型视图时可用。该参数表示一个 lambda 表达式,它仅限于成员访问表达式(如果您尝试使用一些花哨的东西,助手将抛出异常)。它将模型作为参数,并且必须返回此模型的属性。

多亏了这些信息,助手能够确定正在指定的成员的名称,从而生成正确的标记。由于参数是一个 lambda 表达式,它还能够确定该属性的元数据(您可能已经使用属性修饰了视图模型属性,例如[DisplayName], ... 允许您指定其他元数据)。如果帮助器只按照您的要求获取一个值:Html.LabelFor(Model.SomeValue)您了解在此LabelFor方法中您将获得的只是这个值。您将永远无法访问视图模型的元数据,这是 ASP.NET MVC 中的一个基本概念。

于 2012-01-05T09:06:08.883 回答
4

我假设当页面视图呈现时 LabelFor 会自动调用并引用所描述的模型,并且 Lambda 函数会告诉它如何从模型中获取所需的信息?

我不完全确定我明白你对这部分的意思,我猜你的意思是如何@LabelFor知道使用哪个模型?

是的,如果你看一下这样的语法

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)

您可以看到第一个参数以它开头,this这使其成为扩展方法。当您添加该行时,@model CurrencyMvc.Models.RegisterModel this HtmlHelper<TModel>将成为您的 RegisterModel。

我不清楚为什么我们在可以传递实际值 egmUsername 时传递一个函数。

大多数情况下,“lambda 表达式”只是简单的 a Func<T>,但使用剃刀@Html.xfor(例如@Html.LabelFor)您传入的Expression<Func<TModel, TValue>>是 lambda 表达式的树数据结构。通俗地说;一种未编译的 Func。

如果您传入m.Username该方法,则只需“Dale Burrell”。但例如,html文本框生成为

<input type="text" name="Username" value="Dale Burrell">

如您所见,它实际上需要m.Username变量名

哦,当这个助手被调用时,“m”是从哪里来的?

那只是一个变量。就像foreach(var m in dataset){}“m 来自哪里?” ——你编的。你可以用任何东西替换 m

于 2012-01-05T09:06:44.537 回答
3

我知道已经有一段时间了,但我认为下面的链接对于那些仍在寻找一个好的解释的人来说会很有帮助。 http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx

于 2013-10-15T20:30:06.673 回答