繁体   English   中英

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

[英]Asp.net razor view - lambda expression inputs

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

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

但即使我改成它也能正常工作

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

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

电影控制器的索引视图

看看方法的实际签名( 来自MSDN文档

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

DisplayFor实际上是一个扩展方法,可以在HtmlHelper<TModel>实例上使用,其中TModel是模型的类型,由通过@Model指令给出的类型定义。

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

现在,您的疑问是:这些值如何填充? 好吧,因为你已经声明你想要一个IEnumerable<MvcMovie.Models.Movie>类型的模型,你现在可以在你的代码中执行类似的操作

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>>需要IEnumerable<MvcMovie.Models.Movie>模型,并且通过此调用,您已经提供了它。

ASP.NET MVC Html Helpers的设计使他们知道他们一直在处理模型的实例。 请参阅此MSDN文档 ,其中介绍了HtmlHelper的工作原理,它代表了一个通用模型。 由于lambda总是期望输入某些模型属性,因此输入的名称并不重要。

想一想这个函数是这样编写的:

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

您可以称之为:

DisplayNameFor(model.Title);

或等效地:

DisplayNameFor(something.Title);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM