2015-10-30 50 views
3

因此,這裏是從MSDN教程一個視圖文件在asp.net:困惑在ASP.NET「模式」之意(S)的意見

@model EFDBfirst.Models.Student 

@{ 
    ViewBag.Title = "Details"; 
} 

<h2>Details</h2> 

<div> 
    <h4>Student</h4> 
    <hr /> 
    <dl class="dl-horizontal"> 
     <dt> 
      @Html.DisplayNameFor(model => model.LastName) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.LastName) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.FirstName) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.FirstName) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.EnrollmentDate) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.EnrollmentDate) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.MiddleName) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.MiddleName) 
     </dd> 

    </dl> 
    <table class="table"> 
     <tr> 
      <th> 
       Course Title 
      </th> 
      <th> 
       Grade 
      </th> 
      <th> 
       Credits 
      </th> 
     </tr> 

     @foreach (var item in Model.Enrollments) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Course.Title) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Grade) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Course.Credits) 
       </td> 
      </tr> 
     } 
    </table> 
</div> 
<p> 
    @Html.ActionLink("Edit", "Edit", new { id = Model.StudentID }) | 
    @Html.ActionLink("Back to List", "Index") 
</p> 

在第一行有modelModels。我很確定Models 是指項目根目錄下的「Models」文件夾。

幾行下面有@Html.DisplayNameFor(model => model.LastName)其中有model裏面。這與第一行中的model有什麼不同?

然後再次有@foreach (var item in Model.Enrollments)其中包括Model現在這一個不以「s」結束,所以我不認爲它是指項目根目錄中的Models文件夾。那麼這是什麼?

還有modelItem,我不確定它只是一個參數還是指這個類中的某些東西。

最後一個是@Html.ActionLink("Edit", "Edit", new { id = Model.StudentID }) ,它與foreach中使用的類似,這是指相同的東西嗎?

+2

'Models'是命名空間,它可能映射到或不映射到項目中的文件夾。 '@ H​​tml.DisplayNameFor(...)'中的'model'是lambda函數中的局部變量(只存在於括號內)。第一行只告訴ASP設計器'model'是什麼類型,所以Intellisense的作品。在頁面的其餘上下文中的「模型」是傳遞到視圖中的實際Model對象。 –

+2

不要讓在@ Html.DisplayNameFor()中使用的表達式讓你感到困惑......這只是一個lambda,你可以在這裏使用任何你想要的東西..'@ Html.DisplayNameFor(HiImJamie => HiImJamie.LastName)'會工作同樣的方式.. – JamieD77

回答

6

@model EFDBfirst.Models.Student聲明在此視圖中使用的模型是Student

在你看來你可以參考你的模型,使用Model。所以,如果你想要遍歷雖然你已經通過這種意見,學生對象的Enrollments,你就必須做到這一點:

@foreach(var enrollment in Model.Enrollments) 
{ 

} 

對此,@Html.DisplayNameFor(model => model.LastName)這是一個HTML幫手,將爲你創造標籤在這種情況下爲您的模型稱爲LastName的屬性。

關於html幫手,請看看here。此外,你可以通過這個幫手這一行:

@Html.DisplayNameFor(m => m.LastName) 

或該行:

@Html.DisplayNameFor(x => x.LastName) 

不要緊,你利用了model。這只是您傳遞給視圖的模型的參考。

最後但並非最不重要的,這@Html.ActionLink("Edit", "Edit", new { id = Model.StudentID })也是一個html助手,創建一個html鏈接。

+0

你可以添加一些與@ Html.DisplayFor(modelItem => item.Course.Title)相關的解釋來完全回答問題。 –

3

@model EFDBfirst.Models.Student

此行定義什麼模式是要用於這個強類型的視圖。 @modelrazor directive,它允許您指定您的模型。 EFDBfirst.Models.Student是您的模型的完全限定類型。默認情況下,這與您的文件夾結構有關,但不需要。如果你打開你的Student類,你會看到名字空間。命名空間+類是第一行中的內容。

每個強類型視圖都有一個與其關聯的Model對象/屬性。這是您通過操作方法傳入的對象。 return View(someObject)。您在foreach循環中看到的Model是視圖的模型對象。 Model.StudentId也指同一個對象。

您所看到的小寫字母model只是lambda expression中參數的名稱。這與您看到的modelItem相同。 HTML幫助程序將採用您的視圖的模型並將其提供給表達式。既然它是一個表達式,你可以任意指定這個參數。 Html.DisplayFor(foo => foo.FirstName)

2

第一行有模型和模型。我很確定Models是指項目根目錄下的「Models」文件夾。

與include語句或using聲明類似,您聲明此頁面使用包含所有字段和可能需要的其他東西的Student Model。這是一件有約束力的事情......頁面被綁定到顯示時包含Student實例的模型。

下面幾行是@ Html.DisplayNameFor(model => model.LastName) 其中有模型。這個與 第一行的型號有什麼不同?

記住所有的渲染是做服務器端,所以這種說法是說給剃鬚刀,幫我一個忙顯示名稱(元素類型),對於命名的姓氏物業在該學生所呈現的模型實例中。如果更合理,第一個單詞模型可以很容易地用「p」表示。第一個詞可能會誤導,但它是MVC模板如何做到的。

話又說回來有@foreach(在Model.Enrollments VAR項),這 包括型號,現在這一個不以「S」結尾,所以我不認爲 它指的是模型文件夾中的項目根。那麼這是什麼?

無論何時您看到@foreach語句,都會告訴服務器端渲染此控件以遍歷某些內容。在這種情況下,它將是學生對象註冊列表。對於這名學生入學每...

還有modelItem,我不知道,如果它只是一個參數或 參照這一類的東西。

不要試圖從字面上取詞modelItem,因爲您可以輕鬆地將其重命名爲'p'參數。這更多的是Lambda表達式如何工作的問題。在這種情況下,DisplayFor需要設置一個字符串來知道要顯示的內容,modelItem會變成該字符串的值,因爲它'去'item.fieldname來獲取它。你沒有看到的是一個明確的return語句,比如「return item.fieldname」,因爲它在使用Lambdas時被隱式理解。

而最後一個是@ Html.ActionLink( 「編輯」, 「編輯」,新{ID = Model.StudentID}),它類似於的foreach中使用的,這是 指同一事情?

MODEL是學生類型的學生,它有一個StudentID字段這就是如何從學生的對象(模型)中檢索StudentID,該學生是「綁定」到此頁面的。該頁面的DataContext是一個具有MODEL別名的學生實例,MODEL具有一個字段StudentID,單擊後將其返回到服務器端。