我刚学C#和MVC,并试图了解一些例子。
@Html.EditorFor(m => m)
最后,我想通了,“=>”是拉姆达操作者,并且它意味着像“米使得m”。 这并不真正使任何意义,我。 为什么不只是通过以m?
另外,我不认为在我工作的任何视图M的定义。 模型定义,据称这就是这种方法正逐步回升。 这是如何运作的?
最后,我看着定义Html.EditorFor,并没有看到任何超载的传递只是一个单一的参数。 凡被定义这个语法? http://msdn.microsoft.com/en-us/library/ee834942.aspx
让我们打破这通过检查方法签名:
MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
这是通过使用扩展方法的语法,这意味着它加入了一个名为方法EditorFor
到HtmlHelper
,这样你可以拨打电话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的”)是指属性名称。
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
不是一个参数,它是类的类型,即函数延伸。
想想的=>
运算符,意思是“去”,所以(m => m)
指“M变为M”,说你回来了同样的事情的另一种方式m
。
在你的例子, @Html.EditorFor(m => m)
, m
是匿名输入参数lambda表达式m => m
,这是扩展方法的一个参数EditorFor
。 当你在你的问题指出,没有重载此方法的花费比单个参数少; 这是因为它是一个扩展方法和所述第一参数指示它延伸的类型。 第二个参数是一个表达式 ,你可以用这些lambda 表达式 。