Asp.net剃刀视图 - lambda表达式输入

时间:2015-04-17 01:11:31

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

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

  

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

但即使我将其更改为

也能正常工作
  

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

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

Index view for Movies controller

2 个答案:

答案 0 :(得分:1)

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

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

DisplayFor实际上是一个可在HtmlHelper<TModel>个实例上使用的扩展方法,其中TModel是模型的类型,由{的类型定义{ {1}}指令。

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

现在,您提出的问题是:如何填充这些值?好吧,因为你已经声明你想要一个@model类型的模型,你现在可以在你的代码中做这样的事情

IEnumerable<MvcMovie.Models.Movie>

这将是值&#34;填充&#34;的方式。 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<Func<TModel, TValue>>模型,并且通过此调用,您已提供该模型。

答案 1 :(得分:0)

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帮助程序以类似的方式工作。