在MVC @ Html.EditorFor(M =>米)lambda语法(@Html.Edit

2019-07-29 07:18发布

我刚学C#和MVC,并试图了解一些例子。

@Html.EditorFor(m => m)

最后,我想通了,“=>”是拉姆达操作者,并且它意味着像“米使得m”。 这并不真正使任何意义,我。 为什么不只是通过以m?

另外,我不认为在我工作的任何视图M的定义。 模型定义,据称这就是这种方法正逐步回升。 这是如何运作的?

最后,我看着定义Html.EditorFor,并没有看到任何超载的传递只是一个单一的参数。 凡被定义这个语法? http://msdn.microsoft.com/en-us/library/ee834942.aspx

Answer 1:

让我们打破这通过检查方法签名:

MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression
)

这是通过使用扩展方法的语法,这意味着它加入了一个名为方法EditorForHtmlHelper ,这样你可以拨打电话Html.EditorFor 。 但是,我们真正感兴趣的是第二个参数, Expression<Func<TModel, TValue>> 。 这是一个相当复杂的参数,但现在我们可以忽视的事实是它的一个Expression 。 因此简化了,让我们来看看:

Func<TModel, TValue> expression

这意味着,参数是为具有一个参数(类型的任何方法TModel )和返回类型为TValue 。 你已经使用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表达式是(大部分)只是一个普通的方法手短。 因此,所有你正在做的是周围路过的方法。

这里的最后一个音符是我们实际使用表达式目录树,这意味着你实际上并没有通过该方法,你传递表示方法的代码的对象模型(表达式树)。 这本质,只是用来找出你使用(因为通常拉姆达会比较喜欢的属性名m => m.MyProperty ,不仅是m => m )。 这一切都是为了避免魔术字符串,你使用字符串(如“myProperty的”)是指属性名称。



Answer 2:

  1. 在你的榜样,lambda函数并不起任何作用,真的。 但其真正的用途是当你想渲染模型的属性编辑:@ Html.EditorFor(M => m.SomeProperty)。 Lambda表达式其实只是速记功能,但通过的方式强类型的代表 。 这个概念可能是从Javascript比较熟悉:

    myFunction的(函数(X){返回x.SomeProperty;});

  2. 所述“M”是不是预定义的。 它的命名为lambda表达式的第二部分的参数,可以是任何东西:@ Html.EditorFor(无论=>等等)。 (它指的是同样的事情,在这种情况下,页面的模式,不管是什么你的名字。)

  3. 您在Html.EditorFor这些定义中看到的第一个参数是不是一个真正的参数。 你会发现他们使用的就是这个关键字来定义扩展方法 。 该参数是指在调用该方法,在这种情况下的HtmlHelper <模型>对象的对象。



Answer 3:

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)将显示包含用户名和口令2个密码输入中的一个输入。 @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
)

这是HtmlHelper类的扩展方法。 this HtmlHelper<TModel> html不是一个参数,它是类的类型,即函数延伸。



Answer 4:

想想的=>运算符,意思是“去”,所以(m => m)指“M变为M”,说你回来了同样的事情的另一种方式m

在你的例子, @Html.EditorFor(m => m)m是匿名输入参数lambda表达式m => m ,这是扩展方法的一个参数EditorFor 。 当你在你的问题指出,没有重载此方法的花费比单个参数少; 这是因为它是一个扩展方法和所述第一参数指示它延伸的类型。 第二个参数是一个表达式 ,你可以用这些lambda 表达式



文章来源: @Html.EditorFor(m => m) lambda syntax in MVC