【问题标题】:Asp.net razor view - lambda expression inputsAsp.net razor 视图 - lambda 表达式输入
【发布时间】:2015-04-17 01:11:30
【问题描述】:

我正在做this MVC 教程,我不明白@Html.DisplayNameFor 方法内的lambda 表达式中的输入参数。下图有

@Html.DisplayNameFor(model=> model.Title)

但即使我将其更改为

也能正常工作

@Html.DisplayNameFor(something => something.Title)

所以我的问题是如何声明变量 modelsomething 以及如何填充这些值?我只看到它们只是作为 lambda 表达式的输入提供。

【问题讨论】:

  • 它可以是你想要的任何东西——最常见的是@Html.DisplayNameFor(m => m.Title) 它只是说,对于我的模型,我将在这个方法中调用m,给我Title 属性m
  • @StephenMuecke,您是否参考了任何文档来解释其工作原理?如果它已经知道传递的任何东西都应该被视为模型对象,为什么我们需要一个 lambda 表达式而不仅仅是 'anything.Title'?
  • 你也可以使用@Html.Display("Title")传递一个字符串。我将首先查看此搜索的一些结果mvc lambda expressions tutorial
  • 一个 lambda 是一个函数。 => 左边的东西是函数的参数,右边的东西是函数的返回值。该函数被传递给@Html.DisplayNameFor,然后以模型作为参数调用

标签: c# asp.net-mvc asp.net-mvc-4 lambda


【解决方案1】:

查看方法的实际签名 (from MSDN documentation)

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression,
    string templateName
)

DisplayFor 实际上是在HtmlHelper&lt;TModel&gt; 实例上可用的扩展方法,其中TModel 是模型的类型,由@Model 指令给出的类型定义。

如您所见,第二个参数是Expression&lt;Func&lt;TModel, TValue&gt;&gt;。这意味着,在这样的调用中:@Html.DisplayNameFor(x =&gt; x.Foo)x 将始终与您使用 @model 声明的类型相同,无论您使用什么名称。

现在,您的问题是:如何填充这些值?好吧,既然你已经声明你想要一个IEnumerable&lt;MvcMovie.Models.Movie&gt; 类型的模型,你现在可以在你的代码中做这样的事情

public ActionResult MoviesView()
{
    var model = new List<MvcMovie.Models.Movie>()
    { 
        new Movie("Casablanca"),
        new Movie("Fight Club"),
        new Movie("Finding Nemo")
    };

    return View(model);
}

这将是“填充”值的方式。 Expression&lt;Func&lt;TModel, TValue&gt;&gt; 需要一个 IEnumerable&lt;MvcMovie.Models.Movie&gt; 模型,并且,通过这个调用,你已经提供了它。

【讨论】:

    【解决方案2】:

    ASP.NET MVC Html Helpers 被设计成他们知道他们总是在处理你的模型的一个实例。 See this MSDN doc 描述了 HtmlHelper 的工作,它代表了一个通用模型。由于 lambda 总是期待某个模型属性的输入,所以实际上你给输入取什么名字并不重要。

    想想函数是不是这样写的:

    public string DisplayNameFor(string textToDisplay)
    {
         displayStuff();
    }
    

    你可以这样称呼:

    DisplayNameFor(model.Title);
    

    或等效:

    DisplayNameFor(something.Title);
    

    DisplayNameFor() 并不关心输入的名称,只关心它是一个字符串。 Html 助手以类似的方式工作,期望被模型实例调用。

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2023-03-30
      • 1970-01-01
      • 2011-06-23
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多