3

我正在使用 MVC 4 在 VB 中创建一个 Web 应用程序。我一直在查看许多强类型视图的在线示例,但没有找到真正解释模型访问的示例。VB 中对 MVC 的支持和内容量通常是可怕的。

这是我用来创建强类型视图的“项目”对象:

Public Class Project
    Public Property ProjectID
    Public Property Client
    Public Property Description
    ...
End Class

这是使用该模型的强类型视图之一:

@ModelType MvcApplication1.Project
...
<div class="display-label">
    @Html.DisplayNameFor(Function(model) model.ProjectID)
</div>
<div class="display-field">
    @Html.DisplayFor(Function(model) model.ProjectID)
</div>
...

由于网上的例子,我只知道如何调用模型;该功能对我来说毫无意义。当我将鼠标悬停在 DisplayNameFor 上时,Intellisense 会给我以下描述:

<Extension> Public Function DisplayNameFor(Of Integer)(expression as System.Linq.Expressions.Expression(Of System.Func(Of MvcApplication1.Project, Integer))) As System.Web.Mvc.MvcHtmlString
Gets the display name for the model.

这是我正在使用的吗?如果是这样,它看起来一点也不像“(Function(model)model.ProjectID)”,为什么调用的参数之间有空格?我将不胜感激任何澄清,并为此不在 C# 中提前道歉。

4

1 回答 1

2

视图使用称为WebViewPage的类。这就是视图。您可以访问被调用对象的原因Model是因为这个(注意它是类的属性)。您可以随时在 Razor 视图中使用@Model.

@Html是我们从 Razor 视图访问 Html 助手 ( HtmlHelper ) 的方式;对于为我们生成一些 HTML 很有用。DisplayNameFor()是众多扩展方法之一。

它想要的那个长而可怕的参数实际上相对简单。基本上它希望你给它一个匿名函数。这种技术称为Lambda 表达式。在 C# 中(用于比较),它可能如下所示:

SomeMethod(x => x.SomeProperty);

它基本上是一种在现场(通常在一行上)创建函数并使用属性做某事的快捷方式。在Html对象的情况下,它的方法通常需要一个涉及模型的 lambda 表达式。

为什么要这样做?

因为它给了你巨大的力量。通过使用函数,您可以在其中执行任何操作以及涉及对象(参数)的任何操作。

例如:

@Html.LabelFor(Function(f) f.Projects.SingleOrDefault(Function(g) g.Id = 5))

这是做什么的?

  1. 我使用 . 访问视图的 HtmlHelper 对象@Html
  2. 我正在使用该方法LabelFor生成<label for="">标签。
  3. 我开始我的 lambda 表达式并给我的参数一个名称。它可以是我想要的任何名称,助手会自动给我模型(它旨在做到这一点)。在这种情况下,我将其命名为f
  4. 现在我有了我的对象,f我需要选择要为其生成标签的对象。在这个例子中,让我们假设我的模型不是一个Project,而是一个包含项目数组/列表的不同对象。
  5. 我选择项目列表 ( f.Projects),然后我想选择一个项目。我用SingleOrDefault(). SingleOrDefault 接受另一个 lambda,这一次它知道将项目列表作为参数传递。我将调用此项目列表g
  6. 现在有了项目列表,我将最终选择哪个对象。

最后的声明,转成英文的意思是:

给定模型中的项目列表,称为“f”,将它们全部取出并选择一个名为“g”的项目,其中项目的 Id 等于 5,并生成一个 HTML 标签。

于 2013-07-16T00:57:47.077 回答