2013-07-16 30 views
2

我正在使用MVC 4在VB中創建一個Web應用程序。我一直在尋找許多強類型視圖的在線示例,但沒有發現實際解釋模型訪問的內容。在VB中對MVC的支持和內容的數量一般是可怕的。VB在MVC4中強類型模型訪問

這裏是我的「項目」對象,我用它來創建一個強類型的視圖:

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,智能感知給了我下面的描述:

<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

視圖使用一個名爲WebViewPage的類。這是一種觀點。你有權訪問一個名爲Model的對象的原因是因爲這個(注意它是這個類的一個屬性)。您可以隨時在剃刀視圖中使用@Model訪問該模型。

@Html是我們從剃刀視圖訪問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. 現在隨着項目列表,我將最終選擇哪個對象。

最後陳述時,轉移到英文的意思是:

鑑於從示範項目,被稱爲「F」名單,把他們所有,並選擇一個項目,叫做「G」,其中該項目的Id等於5並生成HTML標籤。

+0

謝謝你的澄清,這真的很有幫助。 – ElliotSchmelliot