VB在MVC4中强类型模型访问

时间:2013-07-16 00:06:36

标签: asp.net-mvc vb.net asp.net-mvc-4 strongly-typed-view

我正在使用MVC 4在VB中创建Web应用程序。我一直在寻找强类型视图的许多在线示例,但没有找到实际解释模型访问的实例。一般来说,VB中MVC的支持和内容量是可怕的。

这是我用于创建强类型视图的“Project”对象:

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#。

1 个答案:

答案 0 :(得分:1)

视图使用名为WebViewPage的类。这就是观点。您可以访问名为Model的对象的原因是因为(注意它是类的属性)。您可以随时使用@Model在Razor视图中访问模型。

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

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

SomeMethod(x => x.SomeProperty);

它基本上是一种在现场(通常在一条线上)创建一个函数并对该属性做一些事情的简便方法。对于Html对象,它的方法通常期望涉及模型的lambda表达式。

为什么会这样?

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

例如:

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

这是做什么的?

  1. 我使用@Html访问视图的HtmlHelper对象。
  2. 我正在使用LabelFor方法生成<label for="">代码。
  3. 我开始我的lambda表达式并为我的参数命名。它可以是我想要的任何名称,帮助器会自动给我模型(它的设计就是这样)。在这种情况下,我将其命名为f
  4. 现在我有了我的对象f我需要选择我为其生成标签的对象。在这个例子中,让我们假装我的模型不是Project,而是它是一个不同的对象,它包含一个数组/项目列表。
  5. 我选择项目列表(f.Projects),然后我想选择一个项目。我用SingleOrDefault()执行此操作。 SingleOrDefault采用另一个lambda,这次它知道将项目列表作为参数传递。我将这个项目列表称为g
  6. 现在有了项目列表,我将最终选择哪个对象。
  7. 最终声明转移到英语意味着:

      

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