[.NET MVC4 入門系列03]使用Controller訪問Model中數據


這章中學習使用Controller從Model中獲取數據,並填充到view template中。

一 、添加MoviesController:

在項目的/Controllers文件夾下新建一個控制器,配置如下圖:

*注意:在新建控制器之前需要生成項目,不然找不到我們要用到的模型類(Model class)和數據上下文類(Data Context class)

添加后,會同時生成一個新的/views/Movies文件夾;

在這個文件夾中,會由VS自動添加五個文件,如下圖:

[分析]:ASP.NET MVC 4  automatically created the CRUD (create, read, update, and delete) action methods and views for you (the automatic creation of CRUD action methods and views is known as scaffolding). You now have a fully functional web application that lets you create, list, edit, and delete movie entries.

新建一個帶“模板”的Controller時,asp.net MVC4會自動創建一套Action方法CRUD(create,read,update,delete)、以及配套的View。這一套東西直接可以用於操作相關接的 movie Entities 。

 二、測試並操作數據:

1.Index視圖:

現在就可以測試Movies系列視圖了,自動生成的CRUD各對應一個View,再加上Index共5個。

運行后,用http://localhost:54782/Movies  (端口號隨機的,這不用再解釋吧)就可以訪問index視圖。

注意現在數據庫、數據都不存在,我們可以同過Create New來添加。

2. Create視圖:

點擊Index View中的Create New鏈接,會跳轉到Create View(URL: /movies/create),在其中可以添加記錄到數據庫中,並在第一次運行時,直接生成一個數據庫。

添加完,生成的數據庫:Movies.mdf,默認隱藏,需要顯示所有文件

添加完后會自動跳轉回 Index ,Index View中會自動將新添加的數據顯示出來:

點擊后面的三個鏈接,會分別進入Edit View、Details View 和 Delete View。

 

三、代碼分析:

1. MovieDBContext在MoviesController中的應用:

1 private MovieDBContext db = new MovieDBContext();
2         //
3         // GET: /Movies/
4 
5         public ActionResult Index()
6         {
7             return View(db.Movies.ToList());
8         }

DataBase Context (數據庫上下文類)MovieDBContext,是前面我們定義在Movies.cs中,用來操作Movie Entity 的數據庫上下問的。
這里創建了他的對象——db,通過db.Movies.ToList()方法作為View方法的參數,將整個Movie數據庫中的Movies表內容返回並提交給Index View。

1  public class MovieDBContext : DbContext
2 {
3     public DbSet<Movie> Movies { get; set; }
4 }

 

2.System.Data.Entity.DbContext 類

 

3.System.Data.Entity.DbSet 類

 

 4.強類型Models 和 @model 關鍵字

 到現在,接觸到兩種在controller和view間傳遞數據的方式:

 1)使用ViewBag類:前面的頁面Title處理方法;

 2)使用強類型數據或對象:

   ASP.NET MVC 允許Controller將強類型的數據或對象傳遞給View Template;

   使用強類型的好處在於:編譯時節省檢查時間;VS 智能提示更加方便、豐富;

   例:Details

   先來看movie Controller中action代碼

 1 // GET: /Movies/Details/5
 2 
 3         public ActionResult Details(int id = 0)
 4         {
 5             Movie movie = db.Movies.Find(id);
 6             if (movie == null)
 7             {
 8                 return HttpNotFound();
 9             }
10             return View(movie);
11         }

    傳入參數是電影的id,如果找到,返回一個Movie類對象到視圖中。

    再來看/views/movies/Details.cshtml

 1 @model MvcApplication1.Models.Movie
 2 
 3 @{
 4     ViewBag.Title = "Details";
 5 }
 6 
 7 <h2>Details</h2>
 8 
 9 <fieldset>
10     <legend>Movie</legend>
11 
12     <div class="display-label">
13          @Html.DisplayNameFor(model => model.Title)
14     </div>
15     <div class="display-field">
16         @Html.DisplayFor(model => model.Title)
17     </div>
18 
19     <div class="display-label">
20          @Html.DisplayNameFor(model => model.ReleaseDate)
21     </div>
22     <div class="display-field">
23         @Html.DisplayFor(model => model.ReleaseDate)
24     </div>
25 
26     <div class="display-label">
27          @Html.DisplayNameFor(model => model.Genre)
28     </div>
29     <div class="display-field">
30         @Html.DisplayFor(model => model.Genre)
31     </div>
32 
33     <div class="display-label">
34          @Html.DisplayNameFor(model => model.Price)
35     </div>
36     <div class="display-field">
37         @Html.DisplayFor(model => model.Price)
38     </div>
39 </fieldset>
40 <p>
41     @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
42     @Html.ActionLink("Back to List", "Index")
43 </p>

   第一行@model MvcApplication1.Models.Movie

   通過@model ,可以指派該View所需的對象類型,通過這條代碼,就可以在View中隨意使用Controller傳過來的對應類型的對象了。

  在本例中,可以這樣理解:View中接收到Movie類對象movie到model中,在上面的cshtml代碼中,model指代的就是controller傳過來的movie對象

  又如:Index

1 // GET: /Movies/
2 
3         public ActionResult Index()
4         {
5             return View(db.Movies.ToList());
6         }

    上面代碼中,Controller傳給View的就不是單個對象,而是Movie對象列表;

    對應的,在/views/movies/index.cshtml 中:

 1 @model IEnumerable<MvcApplication1.Models.Movie>
 2 
 3 @{
 4     ViewBag.Title = "Index";
 5 }
 6 
 7 <h2>Index</h2>
 8 
 9 <p>
10     @Html.ActionLink("Create New", "Create")
11 </p>
12 <table>
13     <tr>
14         <th>
15             @Html.DisplayNameFor(model => model.Title)
16         </th>
17         <th>
18             @Html.DisplayNameFor(model => model.ReleaseDate)
19         </th>
20         <th>
21             @Html.DisplayNameFor(model => model.Genre)
22         </th>
23         <th>
24             @Html.DisplayNameFor(model => model.Price)
25         </th>
26         <th></th>
27     </tr>
28 
29 @foreach (var item in Model) {
30     <tr>
31         <td>
32             @Html.DisplayFor(modelItem => item.Title)
33         </td>
34         <td>
35             @Html.DisplayFor(modelItem => item.ReleaseDate)
36         </td>
37         <td>
38             @Html.DisplayFor(modelItem => item.Genre)
39         </td>
40         <td>
41             @Html.DisplayFor(modelItem => item.Price)
42         </td>
43         <td>
44             @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
45             @Html.ActionLink("Details", "Details", new { id=item.ID }) |
46             @Html.ActionLink("Delete", "Delete", new { id=item.ID })
47         </td>
48     </tr>
49 }
50 
51 </table>

     第一行:@model IEnumerable<MvcApplication1.Models.Movie>

     model接到的就是一個Movie對象列表了。

 


 

初學MS 的MVC 4,參照微軟www.asp.net/mvc 中的入門項目,寫個MVC 4的入門系列,以供復習和分享。

微軟入門項目:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

【目錄】

1.[.NET MVC4 入門系列01]Helloworld MVC 4 第一個MVC4程序

2.  [.NET MVC4 入門系列02]MVC Movie 為項目添加Model

3.  [.NET MVC4 入門系列03]使用Controller訪問Model中數據

4.  [.NET MVC4 入門系列04]Controller和View間交互原理

5. .NET MVC4 入門系列05]添加自定義查詢頁Search

6. [.NET MVC4 入門系列06] 在Movie Model和表中添加新字段(Code First Migrations)

7. [.NET MVC4 入門系列07] 在Model模型模塊中添加驗證


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM