gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:04:49 24 4
gpt4 key购买 nike

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

@Html.EditorFor(m => m)

最终我发现“=>”是 lambda 运算符,它的意思类似于“m such that m”。这对我来说真的没有任何意义。为什么不直接传入 m?

此外,我在使用的任何 View 中都没有看到 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,它(本质上)是一种更简洁的方法表示,但将其视为普通方法会有所帮助。所以你是 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”)引用属性名称的魔术字符串。

关于c# - @Html.EditorFor(m => m) MVC 中的 lambda 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10467030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com