.NET MVC如何知道如何使用lambda表达式呈现模型属性?

时间:2011-03-30 09:10:29

标签: asp.net-mvc razor

我对在Visual Studio 2010中创建新MVC 3项目(使用razor)时生成的默认帐户模型,视图和控制器有疑问。 生成的AccountController使用它来加载视图:

public ActionResult LogOn()
    {
        return View();
    }

相应的视图(LogOn.cshtml)包含如下代码:

@Html.LabelFor(m => m.UserName)

我的问题是这个变量“m”定义在哪里?怎么知道这是指模型?没有模型传递给视图,但“m”仍然有效。如果我将所有对“m”的引用更改为另一个字母,它仍然有效!有人能解释一下这里发生了什么吗?

由于

3 个答案:

答案 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将其中一个速记函数作为参数,并根据您指定的模型上下文运行它。