我正在使用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#。
答案 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))
这是做什么的?
@Html
访问视图的HtmlHelper对象。LabelFor
方法生成<label for="">
代码。f
。f
我需要选择我为其生成标签的对象。在这个例子中,让我们假装我的模型不是Project
,而是它是一个不同的对象,它包含一个数组/项目列表。f.Projects
),然后我想选择一个项目。我用SingleOrDefault()
执行此操作。 SingleOrDefault采用另一个lambda,这次它知道将项目列表作为参数传递。我将这个项目列表称为g
。最终声明转移到英语意味着:
给出模型中名为“f”的项目列表,将它们全部取出并选择一个名为“g”的项目,其中项目的Id等于5并生成HTML标签。