让我们走这一行:@Html.LabelFor(m => m.UserName)
这是一行的页面:@model CurrencyMvc.Models.RegisterModel
我假设当页面视图呈现时,LabelFor会自动调用并引用所描述的模型,并且Lambda函数告诉它如何从模型中获取所需的信息?
我不清楚为什么我们在传递实际值时传递函数,例如m.Username。
哦,当这个帮手叫“m”来自何处?
答案 0 :(得分:6)
有两个类用于剃刀页面(第二个类派生自第一个):
System.Web.Mvc.WebViewPage
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中的基本概念。
答案 1 :(得分:4)
我假设当页面视图呈现LabelFor时会被调用 自动引用所描述的模型,并表示 Lambda函数告诉它如何从模型中获取所需的信息?
我不完全确定我对此部分的意思是什么,我猜您的意思是@LabelFor
如何知道要使用哪种模型?
是的,如果你看一下这样的syntax:
public static MvcHtmlString LabelFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
您可以看到第一个参数以this
开头,这使其成为一种扩展方法。当您添加行@model CurrencyMvc.Models.RegisterModel
this HtmlHelper<TModel>
成为您的RegisterModel。
我不清楚为什么我们在通过时传递一个函数 实际值,例如m.Username。
大部分时间都是&#34; lambda表达&#34;只是一个Func<T>
,但是使用剃刀@Html.xfor
(例如@Html.LabelFor
),您传入Expression<Func<TModel, TValue>>
,这是一个lambda表达式的树数据结构。用外行人的话来说;一种未编译的Func。
如果您传入m.Username
,该方法只会包含&#34; Dale Burrell&#34;。但是,例如,html文本框生成为
<input type="text" name="Username" value="Dale Burrell">
正如您所看到的,它实际上需要m.Username
变量名称
哦,当这个帮手叫到哪里时,&#34; m&#34;来自?
这只是一个变量。就像foreach(var m in dataset){}
&#34; m来自何处?&#34; - 你做了。你可以用任何东西替换m
答案 2 :(得分:3)
我知道已经有一段时间但我认为下面的链接对那些仍在寻找好解释的人来说非常有帮助。 http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx