MVC3里面lambada表达式的意思求解

ksws0191053 2014-12-11 03:07:19
加精
新手刚在看MVC3,看到lambada表达式总是不太能懂
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Sname)
</th>
<th>
@Html.DisplayNameFor(model => model.Ssex)
</th>
<th>
@Html.DisplayNameFor(model => model.Sage)
</th>
<th>
@Html.DisplayNameFor(model => model.Sdept)
</th>
<th></th>
</tr>

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Sname)
</td>
<td>
@Html.DisplayFor(modelItem => item.Ssex)
</td>
<td>
@Html.DisplayFor(modelItem => item.Sage)
</td>
<td>
@Html.DisplayFor(modelItem => item.Sdept)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Sno }) |
@Html.ActionLink("Details", "Details", new { id=item.Sno }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Sno })
</td>
</tr>
}

</table>

1.比如上面的输出表头是用@Html.DisplayNameFor(model => model.Sname),输出内容却是用@Html.DisplayFor(modelItem => item.Sname),一个参数是model,为什么另一个是modelItem?
2.如果modelItem是参数的话,为什么后面是item.Sname,这里的modelItem作用是什么?
3.还有,如果只是要输出名字,为什么不直接item.Sname,还要用lambada表达式?
新手不会lambada表达式,求解
...全文
2656 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaotank 2016-08-25
  • 打赏
  • 举报
回复
楼主的这个问题也让我豁然开朗啊,以前都没怎么注意这个问题
patrickjiang 2014-12-12
  • 打赏
  • 举报
回复
我现在等于是两个项目一起做,出差忙了一个大项目一个星期,现在回到家打开这个小项目,一切都忘记了,要重新学,烦啊!!!
ksws0191053 2014-12-11
  • 打赏
  • 举报
回复
引用 11 楼 patrickjiang 的回复:
楼主是在用MVC3做什么开发?我最近在做一个,想和你交流交流。
我没用MVC做开发,就是自己感兴趣学一下MVC,也是个菜鸟
patrickjiang 2014-12-11
  • 打赏
  • 举报
回复
哪讨论MVC的开发多一些啊???
ksws0191053 2014-12-11
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
关键代码是DisplayFor 你注意,它之所以用Lambda表达式,是因为只有这样,它才能检索到属性的属性名和Attribute中的DisplayName。 当然,在真实的MVC中,它的实现更为复杂,但是原理就是这样。 你可以试想下,如果你不用Lambda,你有什么办法可以让调用足够简单,同时能做到相同的功能。
原来里面的机制是这样的,算是懂了,谢谢版主大大
patrickjiang 2014-12-11
  • 打赏
  • 举报
回复
楼主是在用MVC3做什么开发?我最近在做一个,想和你交流交流。
threenewbee 2014-12-11
  • 打赏
  • 举报
回复
关键代码是DisplayFor 你注意,它之所以用Lambda表达式,是因为只有这样,它才能检索到属性的属性名和Attribute中的DisplayName。 当然,在真实的MVC中,它的实现更为复杂,但是原理就是这样。 你可以试想下,如果你不用Lambda,你有什么办法可以让调用足够简单,同时能做到相同的功能。
threenewbee 2014-12-11
  • 打赏
  • 举报
回复
这个问题很多人问,这次干脆说明白。 我写了一个演示其原理的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class User
    {
        public int ID { get; set; }

        [DisplayName("姓名")]
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var model = new User() { ID = 1, Name = "张三" };
            var mvc = new MVCHelper<User>(model);
            Console.WriteLine(mvc.DisplayFor(modelitem => modelitem.ID));
            Console.WriteLine(mvc.TextBoxFor(modelitem => modelitem.ID));
            Console.WriteLine(mvc.DisplayFor(modelitem => modelitem.Name));
            Console.WriteLine(mvc.TextBoxFor(modelitem => modelitem.Name));
        }
    }

    class MVCHelper<TModel>
    {
        private TModel model { get; set; }

        public MVCHelper(TModel m) { model = m; }

        public string DisplayFor<T>(Expression<Func<TModel, T>> exp)
        {
            string s = "";
            var t = ((exp.Body) as MemberExpression).Member;
            if (t.GetCustomAttributes(typeof(DisplayNameAttribute), false).Any())
            {
                s = (t.GetCustomAttributes(typeof(DisplayNameAttribute), false)[0] as DisplayNameAttribute).DisplayName;
            }
            else
            {
                s = t.Name;
            }
            return string.Format("<label for='{0}'>{1}</label>", exp.Body, s);
        }
        public string TextBoxFor<T>(Expression<Func<TModel, T>> exp)
        {
            return string.Format("<input type='textbox'>{0}</input>", exp.Compile()(model));
        }
    }
}
<label for='modelitem.ID'>ID</label> <input type='textbox'>1</input> <label for='modelitem.Name'>姓名</label> <input type='textbox'>张三</input> Press any key to continue . . .
ksws0191053 2014-12-11
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
再多说几句。也许你会问,为什么不直接写 @Html.DisplayNameFor(model.Sname) 而要写 @Html.DisplayNameFor(model => model.Sname) 这是因为Lambda表达式不同于一般的委托或者函数调用,它是以表达式树的形式被编译为代码的。你可以想象,这个表达式的每个语句,都可以在程序运行的时候被查询出来。 DisplayNameFor可以依赖这些信息,还原出Sname这个属性名,甚至它包含的Attribute,比如常用的DisplayName、Required、Length等等,根据它的显示名称、是否为必须填写的字段、允许的长度等等来格式化HTML标记。 而如果没有Lambda表达式,那么这些就要程序员手工传进去了,无疑需要很多额外的代码
噢,大概明白了,谢谢你
明缘 2014-12-11
  • 打赏
  • 举报
回复
Model是System.Web.Mvc.ViewPage类的一个属性,MVC的所有页面都继承了ViewPage,System.Web.Mvc.ViewPage<IEnumerable<Manage.Models.Entity.TempInfo>>这句声明了Model的类型。
threenewbee 2014-12-11
  • 打赏
  • 举报
回复
引用 2 楼 ksws0191053 的回复:
[quote=引用 1 楼 caozhy 的回复:] model是你的模型,modelitem是lambda表达式的参数 你可以将lambda当作一个函数(只是没有名字) 我们假设它的名字叫foo,Sname是string,modelitem是User,那么 model => model.Sname 就是 string foo(User modelitem) { return model.Sname; } 以及 @Html.DisplayNameFor(foo)
谢谢版主,你说的我大概明白了,可是我还有两个问题: 1.为什么foo的参数是modelitem,下面却return model.Sname,不应该是modelitem.Sname吗? 2.既然要输出的只是model.Sname,为什么不直接@Html.DisplayNameFor(model.Sname),还要绕一圈用一个匿名函数的形式?[/quote] 那是我笔误 是 string foo(User modelitem) { return modelitem.Sname; }
threenewbee 2014-12-11
  • 打赏
  • 举报
回复
再多说几句。也许你会问,为什么不直接写 @Html.DisplayNameFor(model.Sname) 而要写 @Html.DisplayNameFor(model => model.Sname) 这是因为Lambda表达式不同于一般的委托或者函数调用,它是以表达式树的形式被编译为代码的。你可以想象,这个表达式的每个语句,都可以在程序运行的时候被查询出来。 DisplayNameFor可以依赖这些信息,还原出Sname这个属性名,甚至它包含的Attribute,比如常用的DisplayName、Required、Length等等,根据它的显示名称、是否为必须填写的字段、允许的长度等等来格式化HTML标记。 而如果没有Lambda表达式,那么这些就要程序员手工传进去了,无疑需要很多额外的代码
ksws0191053 2014-12-11
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
model是你的模型,modelitem是lambda表达式的参数 你可以将lambda当作一个函数(只是没有名字) 我们假设它的名字叫foo,Sname是string,modelitem是User,那么 model => model.Sname 就是 string foo(User modelitem) { return model.Sname; } 以及 @Html.DisplayNameFor(foo)
谢谢版主,你说的我大概明白了,可是我还有两个问题: 1.为什么foo的参数是modelitem,下面却return model.Sname,不应该是modelitem.Sname吗? 2.既然要输出的只是model.Sname,为什么不直接@Html.DisplayNameFor(model.Sname),还要绕一圈用一个匿名函数的形式?
threenewbee 2014-12-11
  • 打赏
  • 举报
回复
model是你的模型,modelitem是lambda表达式的参数 你可以将lambda当作一个函数(只是没有名字) 我们假设它的名字叫foo,Sname是string,modelitem是User,那么 model => model.Sname 就是 string foo(User modelitem) { return model.Sname; } 以及 @Html.DisplayNameFor(foo)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧