有人可以解释这个陈述是如何工作的吗?

时间:2013-06-28 14:31:02

标签: c# asp.net-mvc linq

当intellisense弹出时,我正在使用以下模型为我的一个View构建一个Html帮助器,我不知道你能做什么。基本上我的模型如下

public class Mainclass
{
    public List<main> mainset { get; set; }
 // do sth to load and save model info
}
 public class main
{
    public personalinfo info { get; set; }
    public addressinfo currentaddr { get; set; }
    public addressinfo[] otheraddr { get; set; }
    public telephone currenttel { get; set; }
    public telephone[] othertel { get; set; }
 }
public class personalinfo
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Ni { get; set; }
    public string dob { get; set; }
    public employer currentemployer { get; set; } //another class employer
    public employer[] otheremployer { get; set; } //an array of employer class
}

intellisense弹出的是(model =&gt; m.info.Name)。

   @if ( Model.mainset != null){
        foreach ( var m in Model.subset )
        {
            <div class="editor-label">
            @Html.LabelFor(model => m.info.Name)
            </div>
            <div class="editor-field">
            @Html.EditorFor(model => m.info.Name)
            @Html.ValidationMessageFor(model => m.info.Name)
            <div class="editor-label">
        }

所以我想知道这个陈述是如何起作用的?它是否允许我在没有帮助器或ajax或json的情况下直接在主模型中设置子域?

3 个答案:

答案 0 :(得分:2)

这是一个lambda,并不像它看起来那么神奇(无论如何从高层开始)。

最好从源头学习:Lambda Expressions - MSDN C# Programming Guide

基本上,在MVC中,使用lambda的方法会在发布表单时将该属性绑定到模型中。

答案 1 :(得分:1)

Lambda只是一个运营商。关键是ValidationMessageFor()EditorFor()函数。他们期望Func<T>参数是一个委托。使用lambda,您可以传递参数,该参数是委托签名中的模型,在lambda运算符之后,您将编写方法的实现。因此,如果扩展模型,您将在intellisense中看到新成员。

注意: 必须在使用之前实例化委托,但MVC框架在您创建强类型视图时动态处理它。 Location of HtmlHelper instantiation for ASP.NET MVC

答案 2 :(得分:1)

为了澄清一下,你不是一般都会问一下lambda的问题,而是问UNUSED吗?

foreach (var item in Model.Items)
{
    @Html.DisplayFor(UNUSED => item.Foo)
}

它有效,因为你确实传递了item.Foo的值。 MVC帮助程序不能再将它绑定到模型的属性,因此您可以使用此表示法进行显示,但不能直接用于编辑控件。