【问题标题】:Understanding Func<T, TResult> Delegate with MVC使用 MVC 理解 Func<T, TResult> 委托
【发布时间】:2015-05-14 21:54:58
【问题描述】:

我正试图围绕 Func 代表,但似乎我不清楚。我知道 T 是一个参数 & TResult 是一个返回类型。

在 MVC 中我一直使用这个函数:

@model Products
@Html.TextBoxFor(s=>s.my_property)

现在TextBoxFor函数怎么知道传给我的参数实际上是一个“Products模型”。

下面是 TextBoxFor 模型的签名:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IDictionary<string, Object> htmlAttributes
)

所以我的问题是,当我调用 Html.TextBoxFor(s) 时,这个方法怎么会知道“s”是“产品”模型以及 TModel 如何映射到参数“s”(知道它的产品模型和我需要退货)?

【问题讨论】:

  • 您更可能使用public static MvcHtmlString TextBoxFor&lt;TModel, TProperty&gt;(this HtmlHelper&lt;TModel&gt; htmlHelper, Expression&lt;Func&lt;TModel, TProperty&gt;&gt; expression) 和两个参数。
  • 泛型类型TModel 得到解析,因为您的视图开头可能有一个@model YourNamespace.Products 语句。该语句实质上是告诉编译器使用您的模型类型调用 TextBoxFor 方法。至于您的第二个问题,您可能需要考虑查找ActionFunc(或一般而言,C# delegates)的稍微简单的示例。
  • HtmlTextBoxFor的TModel怎么知道传给我的参数是“Products”模型?
  • 因为你告诉它它将与@model Products 行一起

标签: c# asp.net-mvc razor delegates


【解决方案1】:

由于@model Products 指令,Html 属性 (@Html) 的类型为 HtmlHelper&lt;Products&gt;。这就是 Razor 引擎的工作原理。

TextBoxForHtmlHelper&lt;TModel&gt; 的扩展方法,在您的代码中,您在HtmlHelper&lt;Products&gt; 的实例上调用它,因此TModel 被解析为Products

然后,编译器可以从那里轻松地将TProperty 绑定到my_property 的类型,因为它知道TModel 是什么并且可以推断出lambda “返回”的内容。 p>


旁注:您必须知道Expression&lt;Func&lt;T&gt;&gt;Func&lt;T&gt;完全不同:

  • Func&lt;...&gt; 只是一个简单的委托,对某处的一段可执行代码的引用,这是不透明
  • 另一方面,Expression&lt;Func&lt;...&gt;&gt; 是一个表达式树,它是AST 的一种。

当您编写 lambda 时,编译器会生成不同的代码,具体取决于您是将 lambda 分配给 Func&lt;...&gt; 还是 Expression&lt;Func&lt;...&gt;&gt;。在第一种情况下,它将编译 lambda 并生成一个委托。在第二种情况下,它会发出一个表达式树。

如需深入解释,您可以阅读 Eric Lippert 的系列Lambda 表达式与匿名方法Part 1Part 2Part 3Part 4Part 5

【讨论】:

  • 所以基本上是它的 HtmlHelper.TextBoxFor(s=>s.my_property) 其中“s”是提供的模型。
  • @highwingers 好吧...更确切地说是:InputExtensions.TextBoxFor(Html, s=&gt;s.my_property),其中Html.GetType() == typeof(HtmlHelper&lt;Products&gt;)。第二个参数的类型绑定到Expression&lt;Func&lt;Products, WhateverTypeMyPropertyIs&gt;&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多