天天看點

[Asp.net MVC]Asp.net MVC5系列——從控制器通路模型中的資料

目錄

概述

從控制器通路模型中的資料

強類型模型與@model關鍵字

總結

系列文章

[Asp.net MVC]Asp.net MVC5系列——第一個項目

[Asp.net MVC]Asp.net MVC5系列——添加視圖

[Asp.net MVC]Asp.net MVC5系列——添加模型

上篇文章介紹了如何添加Model,在這篇文章中,我們将通過控制器通路模型中的資料,還有有寫朋友問我,這麼簡單的東西有必要分享嗎?其實有些東西真的很簡單,沒必要分享,但是這也是我學習的曆程,希望記錄自己是如何學習Asp.net mvc5,這還是看個人心态了,别總以為這簡單,那也簡單,這東西簡單,一看就會,還是那句話,好記性不如爛筆頭,好思路不如爛鍵盤!,别人敲的是别人的,自己實踐一下,才有可能是自己的。

上篇文章,通過ef添加了student,score,course類,這裡我們先使用控制器通路student中的資料。(你也可以建立一個測試的資料庫,資料不必多,如果有個學習用的測試資料庫,再好不過了。)

添加一個StudentController控制器(如何添加控制器,可以參考本系列的第一篇文章),這裡我們還是添加一個空的控制器,雖然有專門針對ef的。

[Asp.net MVC]Asp.net MVC5系列——從控制器通路模型中的資料

StudentController控制器代碼

1     public class StudentController : Controller
2     {
3         //
4         // GET: /Student/
5         public ActionResult Index()
6         {
7             return View();
8         }
9      }      

然後打開,如圖所示的cs檔案

[Asp.net MVC]Asp.net MVC5系列——從控制器通路模型中的資料

可以看到TestDataBaseEntityies類繼承DbContext(資料庫上下文)。

修改學生控制器中的代碼,修改後的完整代碼如下:

1     public class StudentController : Controller
 2     {
 3         /// <summary>
 4         /// entity資料庫上下文 執行個體
 5         /// </summary>
 6         TestDataBaseEntities entity = new TestDataBaseEntities();
 7         //
 8         // GET: /Student/
 9         public ActionResult StudentList()
10         {
11             //使用linq查詢所有的80後的學生。
12             var students = from s in entity.Student
13                            where s.stuBirthdate.Year >= 1980 && s.stuBirthdate.Year<1990
14                            select s;
15             return View(students.ToList());
16         }
17     }      

這段代碼實施了一個LINQ查詢來擷取80後的所有學生。我們還需要一個視圖模闆來顯示這個學生清單,是以在StudentList方法内點選滑鼠右鍵,然後點選“添加視圖”來添加一個視圖。

由于這裡我們需要将一個Student類傳遞給視圖,是以在“添加視圖”對話框中,與本教程中前幾次在該對話框中之行的操作有所不同,前幾次我們都是直接點選添加按鈕來建立一個空白的視圖模闆,但是這一次我們想讓Visual Web Developer為我們自動建立一個具有一些預設處理的強類型的視圖,因為這裡我們要顯示學生清單,是以我們選擇List模闆,如下圖所示:

[Asp.net MVC]Asp.net MVC5系列——從控制器通路模型中的資料

點選添加按鈕,Visual Web Developer自動生成一個視圖,并且自動在視圖檔案中添加顯示學生清單所需要的代碼。這裡,我們首先用與前面修改HelloWorld控制器所用的視圖中的标題同樣的方法來修改這個Student控制器所用視圖中的标題。

      另外,将清單标題中的文字全部修改為中文名稱,并修改操作為中文,全部代碼如下。

@model IEnumerable<Wolfy.FirstMVCProject.Models.Student>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>學生資訊</title>
</head>
<body>
    <p>
        @Html.ActionLink("添加", "Create")
    </p>
    <table class="table">
        <tr>
            <th>
               姓名
            </th>
            <th>
              性别
            </th>
            <th>
               生日
            </th>
            <th>
               入學時間
            </th>
            <th>
               位址
            </th>
            <th>
               郵箱
            </th>
            <th>
               電話
            </th>
            <th>
               删除
            </th>
            <th>
                錄入時間
            </th>
            <th>
               班級名稱
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.stuName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuSex)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuBirthdate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuStudydate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuAddress)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuEmail)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuPhone)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuIsDel)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.stuInputtime)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Course.className)
            </td>
            <td>
                @Html.ActionLink("編輯", "Edit", new { id=item.stuId }) |
                @Html.ActionLink("詳細", "Details", new { id=item.stuId }) |
                @Html.ActionLink("删除", "Delete", new { id=item.stuId })
            </td>
        </tr>
    }
    
    </table>
</body>
</html>      

然後在Models下找到Student檔案夾,選擇StudentList.cshtml,右鍵,在浏覽器中檢視。

在本教程的前文中,我們介紹了一個控制器可以使用ViewBag對象來将資料或對象傳遞到視圖模闆中。ViewBag是一個動态對象,它提供了一種便利的,後期綁定的方法來将資訊從控制器傳遞到視圖中。

ASP.NET MVC也提供了一種利用強類型的方法來将資料或對象傳遞到視圖模闆中。這種強類型的方法為你的編碼過程提供了很豐富的編輯時的智能輸入提示資訊與非常好的編譯時的檢查。

接下來我們将結合這種方法與我們的Student控制器(StudentController)與視圖模闆(StudentList.cshtml)一起使用。

請注意在我們的StudentController控制器的StudentList方法中,我們在調用View()方法時傳入了一個參數,代碼如下所示。

1     public class StudentController : Controller
 2     {
 3         /// <summary>
 4         /// entity資料庫上下文 執行個體
 5         /// </summary>
 6         TestDataBaseEntities entity = new TestDataBaseEntities();
 7         //
 8         // GET: /Student/
 9         public ActionResult StudentList()
10         {
11             //使用linq查詢所有的80後的學生。
12             var students = from s in entity.Student
13                            where s.stuBirthdate.Year >= 1980 && s.stuBirthdate.Year<1990
14                            select s;
15             return View(students.ToList());
16         }
17     }      

請注意如下這一行代碼表示将一個Student清單從控制器傳遞到了視圖中。

return View(students.ToList());      

通過在視圖模闆檔案的頭部使用@model語句,視圖模闆可以識别傳入的參數中的對象類型是否是該視圖模闆所需要的對象類型。當我們在建立這個Student控制器所使用的模闆時,我們在“添加視圖”對話框中選擇了模型類Student, 在支架模闆下拉框中選擇了“List”。是以Visual Web Developer自動在我們的視圖模闆檔案的第一行中添加了如下所示的語句。

@model IEnumerable<Wolfy.FirstMVCProject.Models.Student>      

 @model關鍵字允許我們在視圖模闆中直接通路在控制器類中通過使用強類型的“模型”而傳遞過來的Student類的清單。例如,在我們的StudentList.cshtml視圖模闆中,我們可以通過foreach語句來周遊這個強類型的模型,通路其中的每一個Student對象。代碼如下所示。

1   @foreach (var item in Model) {
 2         <tr>
 3             <td>
 4                 @Html.DisplayFor(modelItem => item.stuName)
 5             </td>
 6             <td>
 7                 @Html.DisplayFor(modelItem => item.stuSex)
 8             </td>
 9             <td>
10                 @Html.DisplayFor(modelItem => item.stuBirthdate)
11             </td>
12             <td>
13                 @Html.DisplayFor(modelItem => item.stuStudydate)
14             </td>
15             <td>
16                 @Html.DisplayFor(modelItem => item.stuAddress)
17             </td>
18             <td>
19                 @Html.DisplayFor(modelItem => item.stuEmail)
20             </td>
21             <td>
22                 @Html.DisplayFor(modelItem => item.stuPhone)
23             </td>
24             <td>
25                 @Html.DisplayFor(modelItem => item.stuIsDel)
26             </td>
27             <td>
28                 @Html.DisplayFor(modelItem => item.stuInputtime)
29             </td>
30             <td>
31                 @Html.DisplayFor(modelItem => item.Course.className)
32             </td>
33             <td>
34                 @Html.ActionLink("編輯", "Edit", new { id=item.stuId }) |
35                 @Html.ActionLink("詳細", "Details", new { id=item.stuId }) |
36                 @Html.ActionLink("删除", "Delete", new { id=item.stuId })
37             </td>
38         </tr>
39     }      

 因為這裡的“模型”是強類型的(IEnumerable<Student>),是以在循環周遊時“模型”中的每一個項目(“item”)也是一個強類型的Student對象,可以直接通路該對象的每一個屬性。同時這也意味着我們可以在編譯時檢查我們的代碼,同時在書寫代碼時也可以使用代碼編輯器提供的智能輸入提示資訊,如圖所示。

[Asp.net MVC]Asp.net MVC5系列——從控制器通路模型中的資料

這篇文章介紹了如何從控制器通路模型中的資料,需要注意的地方,在使用ef的時候,首先需要資料上下文對象。

介紹了強類型模型與@model關鍵字。

ViewBag是一個動态對象,它提供了一種便利的,後期綁定的方法來将資訊從控制器傳遞到視圖中。

通過在視圖模闆檔案的頭部使用@model語句,視圖模闆可以識别傳入的參數中的對象類型是否是該視圖模闆所需要的對象類型。

就啰嗦到這裡吧。

參考文章

http://www.asp.net/mvc/tutorials/mvc-5/introduction/accessing-your-models-data-from-a-controller

  • 部落格位址:http://www.cnblogs.com/wolf-sun/

    部落格版權:如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

    再次感謝您耐心的讀完本篇文章。