Asp.net Razor视图 - Lambda表达式输入

3
我正在学习这个MVC教程(链接),但是我不理解@Html.DisplayNameFor方法内部的lambda表达式中的输入参数。下面的图片显示:

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

但是即使我将其更改为

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

它也能正常工作。所以我的问题是变量modelsomething是如何被声明和赋值的?我只看到它们被简单地提供为lambda表达式的输入。

Movies控制器的Index视图


3
它可以是任何你想要的 - 最常见的是 @Html.DisplayNameFor(m => m.Title)。它的意思是,在这个方法中,对于我的模型(我将在其中称之为m),给我mTitle属性。 - user3559349
@StephenMuecke,你有没有任何文档的参考来解释这是如何工作的?如果它已经知道任何传递的内容应该被视为模型对象,为什么我们需要一个 lambda 表达式而不是只使用 'anything.Title'? - user3885927
你也可以使用 @Html.Display("Title") 传递一个字符串。我建议先查看一些来自这个搜索结果的教程 mvc lambda expressions tutorial - user3559349
1
一个 lambda 是一个函数。=> 左侧的内容是函数的参数,右侧的内容是函数的返回值。该函数被传递给 @Html.DisplayNameFor,然后使用模型作为参数进行调用。 - pala_
2个回答

1

请查看该方法的实际签名(从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> 模型,并且通过此调用,您已经提供了它。

0

ASP.NET MVC Html Helpers 的设计是这样的,它们知道它们总是在处理您模型的实例。请参阅此 MSDN 文档,其中描述了 HtmlHelper 处理代表通用模型的 TModel。由于 Lambda 表达式始终期望某个模型属性的输入,因此实际上无论您如何命名输入都没有关系。

想象一下如果函数是这样编写的:

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

你可以称之为:

DisplayNameFor(model.Title);

或者等价地:

DisplayNameFor(something.Title);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接