我对在Visual Studio 2010中创建新MVC 3项目(使用razor)时生成的默认帐户模型,视图和控制器有疑问。 生成的AccountController使用它来加载视图:
public ActionResult LogOn()
{
return View();
}
相应的视图(LogOn.cshtml)包含如下代码:
@Html.LabelFor(m => m.UserName)
我的问题是这个变量“m”定义在哪里?怎么知道这是指模型?没有模型传递给视图,但“m”仍然有效。如果我将所有对“m”的引用更改为另一个字母,它仍然有效!有人能解释一下这里发生了什么吗?
由于
答案 0 :(得分:5)
这是一个名为“Lambda Expression”的C#3.0功能。
你可以查看这些好文章,了解它是什么(顺便说一下,它非常有用)。
http://blogs.msdn.com/b/ericwhite/archive/2006/10/03/lambda-expressions.aspx
http://blah.winsmarts.com/2006/05/19/demystifying-c-30--part-4-lambda-expressions.aspx
对于问题的第2部分,如果您注意到,@Html
下的所有方法都是与模型相关的方法,这意味着所有这些方法都希望对您传递的模型起作用。
如果您在登录视图中检查第一行,您将找到以下行:
@model YOUR_APP_NAME.Models.LogOnModel
其中定义了此视图的模型类型为logonModel类型。 (可在Models文件夹中找到。)
这样,奇怪的m
代表了传递的Logon模型,因此我们可以像输入m.UserName
答案 1 :(得分:1)
在这种情况下,如果变量名称作为lamda expression的一部分提供,则为“m”。
从链接:
所有lambda表达式都使用lambda operator =>,读作“去 到了。“lambda的左边 运算符指定输入 参数(如果有的话)和右侧 持有表达或陈述 块。 lambda表达式x => X * x读作“x转到x乘x。”
答案 2 :(得分:0)
Lambda表达式只是简写C#委托。委托是可以作为参数传递的函数,就像javascript函数一样,如回调。
x => x.Name
实际上只是创建其中一个委托的简写,它将一些变量x作为参数,并返回此变量Name属性。
(parameters) => (expression)
是
Function(parameters) {
return expression;
}
因此LabelFor
将其中一个速记函数作为参数,并根据您指定的模型上下文运行它。