C# @MVC中的Html.EditorFor(m=>;m)lambda语法

C# @MVC中的Html.EditorFor(m=>;m)lambda语法,c#,razor,lambda,extension-methods,editorfor,C#,Razor,Lambda,Extension Methods,Editorfor,我只是在学习C#和MVC,并试图理解一些示例 @Html.EditorFor(m => m) 最后,我发现“=>”是lambda操作符,它的意思是“m以至于m”。这对我来说真的没有任何意义。为什么不直接进入m 而且,我在使用的任何视图中都没有看到m的定义。模型被定义了,据说这就是这个方法所采用的。这是怎么回事 最后,我查看了Html.EditorFor的定义,没有看到只传入一个参数的重载。这个语法是在哪里定义的?? 在您的示例中,lambda函数没有任何用途,对。但它的真正用途是当您要

我只是在学习C#和MVC,并试图理解一些示例

@Html.EditorFor(m => m)
最后,我发现“=>”是lambda操作符,它的意思是“m以至于m”。这对我来说真的没有任何意义。为什么不直接进入m

而且,我在使用的任何视图中都没有看到m的定义。模型被定义了,据说这就是这个方法所采用的。这是怎么回事


最后,我查看了Html.EditorFor的定义,没有看到只传入一个参数的重载。这个语法是在哪里定义的??

  • 在您的示例中,lambda函数没有任何用途,对。但它的真正用途是当您要为模型的属性呈现编辑器时:@Html.EditorFor(m=>m.SomeProperty)。Lambda表达式实际上只是函数的简写,但它是强类型的。这个概念在Javascript中可能更为熟悉:

    myFunction(函数(x){return x.SomeProperty;})

  • “m”不是预定义的。它为lambda表达式的第二部分命名参数,可以是任意内容:@Html.EditorFor(whatever=>whatever)。(它指的是同一件事,在本例中是指页面的模型,而不管您如何命名它。)

  • 在Html.EditorFor的这些定义中看到的第一个参数实际上不是一个参数。您会注意到他们使用this关键字来定义。该参数引用调用该方法的对象,在本例中为HtmlHelper对象


  • =>
    操作符视为“goes to”的意思,因此
    (m=>m)
    的意思是“m goes to m”,这是另一种说法,表示您得到了相同的东西
    m

    在您的示例中,
    @Html.EditorFor(m=>m)
    m
    是lambda表达式
    m=>m
    的匿名输入参数,它是扩展方法
    EditorFor
    的参数。正如您在问题中所指出的,此方法的任何重载都不少于一个参数;这是因为它是一个函数,第一个参数指示它扩展的类型。第二个参数是,您可以对这些参数使用lambda表达式。

    1。

    • @Html.EditorFor(m=>m)
      -整个模型的显示编辑器
    • @Html.EditorFor(m=>m.propertyName)
      -显示模型特定属性的编辑器
    2.

    @Html.EditorFor(m=>m)
    等于
    @Html.EditorFor(t=>t)
    @Html.EditorFor(randomName=>randomName)
    。名称不重要,它只是参数的名称。此参数的类型为视图模型的类型

    您必须传递函数,因为重要的不仅仅是值。反射用于获取描述如何显示属性的属性。看看这个例子

    public class ResetPasswordModel
    {
        public string Username { get; set; }
    
        [DataType(DataType.Password)]
        public string NewPassword { get; set; }
        [DataType(DataType.Password)]
        public string PasswordConfirmed { get; set; }
    }
    
    属性描述,NewPassword应该是密码字段,而不是常规输入。如果我们传递了值,那就不可能了

    在我们的示例中,
    @Html.EditorFor(m=>m)
    将显示一个用户名输入和两个密码输入
    @Html.EditorFor(m=>m.NewPassword)
    将显示具有密码类型的输入

    3.

    http://msdn.microsoft.com/en-us/library/ee402949.aspx

    public static MvcHtmlString EditorFor<TModel, TValue>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TValue>> expression
    )
    
    public静态MvcHtmlString编辑器(
    这个HtmlHelper html,
    表情
    )
    

    这是HtmlHelper类的扩展方法
    此HtmlHelper html
    不是参数,它是函数扩展的类类型。

    让我们通过检查方法签名来分解它:

    MvcHtmlString EditorFor<TModel, TValue>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TValue>> expression
    )
    
    这意味着参数是具有一个参数(类型为
    TModel
    )且返回类型为
    TValue
    )的任何方法。您一直在使用lambdas,它(本质上)是一种更简洁的方法表示,但将其视为一种普通方法会有所帮助。那么你是说lambda正在获取一个模型并返回一个模型:

    m => m
    
    这没有那么有趣,所以让我们将其与从模型中返回属性的更现实的场景进行比较:

    m => m.MyStringProperty
    
    现在让我们将其与您在某处声明的普通静态方法进行比较:

    public static class MyStaticClass 
    {
        public static string Foo(TModel model) 
        {
            return model.MyStringProperty;
        }
    }
    
    虽然在这里它不是
    TModel
    ——它将是您通过
    @model
    声明的模型类型。现在,为了便于讨论,您可以在调用
    EditorFor
    时使用此方法:

    Html.EditorFor(MyStaticClass.Foo);
    
    总之,lambda(在大多数情况下)只是常规方法的简写。所以你所做的就是传递方法


    最后一点要注意的是,我们实际上使用的是表达式树,这意味着您实际上并没有传递方法,而是传递一个表示方法代码的对象模型(表达式树)。本质上,这只是用来计算您正在使用的属性名称(因为lambda通常更像
    m=>m.MyProperty
    ,而不仅仅是
    m=>m
    )。这一切都是为了避免使用字符串(即“MyProperty”)引用属性名的神奇字符串。

    “并且只传递一个参数时不会看到任何重载”-EditorFor是一种扩展方法,因此您要寻找一个重载,其中包含两个参数,第一个是“This”。另外,我建议在mvc3中构建站点时使用特定类型的编辑器,如
    @Html.TextBoxFor(m=>m.name)
    ,这样,如果需要默认值,它就可以工作。其中,我(至少)无法将其分配给
    编辑器for
    。在
    EditorFor
    不支持占位符的地方,TextBox/TextArea等也支持占位符。因此,您可以执行
    @Html.TextBoxFor(m=>m.Name,new{placeholder=“John Doe”})
    ,mvc将自动调用
    Html.EditorFor(MyStaticClass.Foo);