目錄
系列文章
[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的。
StudentController控制器代碼
1 public class StudentController : Controller 2 { 3 // 4 // GET: /Student/ 5 public ActionResult Index() 6 { 7 return View(); 8 } 9 }
然后打開,如圖所示的cs文件
可以看到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模板,如下圖所示:
點擊添加按鈕,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,右鍵,在瀏覽器中查看。
強類型模型與@model關鍵字
在本教程的前文中,我們介紹了一個控制器可以使用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對象,可以直接訪問該對象的每一個屬性。同時這也意味着我們可以在編譯時檢查我們的代碼,同時在書寫代碼時也可以使用代碼編輯器提供的智能輸入提示信息,如圖所示。
總結
這篇文章介紹了如何從控制器訪問模型中的數據,需要注意的地方,在使用ef的時候,首先需要數據上下文對象。
介紹了強類型模型與@model關鍵字。
ViewBag是一個動態對象,它提供了一種便利的,后期綁定的方法來將信息從控制器傳遞到視圖中。
通過在視圖模板文件的頭部使用@model語句,視圖模板可以識別傳入的參數中的對象類型是否是該視圖模板所需要的對象類型。
就啰嗦到這里吧。
參考文章
http://www.asp.net/mvc/tutorials/mvc-5/introduction/accessing-your-models-data-from-a-controller