天天看點

ASP.NET MVC 5 -從控制器通路資料模型

原文:

在本節中,您将建立一個新的<code>moviescontroller</code>類,并在這個controller類裡編寫代碼來取得電影資料,并使用視圖模闆将資料展示在浏覽器裡。

在開始下一步前,先build一下應用程式(生成應用程式)(確定應用程式編譯沒有問題)

在解決方案上,用滑鼠右鍵單擊controller檔案夾,點選新增,再選擇controller。

在scaffold新增對話框,選擇mvc

5  controller with views, using entity framework,

點選新增。

· 控制器(controller)名稱輸入:

moviescontroller.

· 模型類(model class)選擇: movie

(mvcmovie.models) .

· 資料上下文類(data context

class)選擇:moviedbcontext (mvcmovie.models)

下圖顯示了完成的對話框。

單擊添加(如果你得到一個錯誤,則很可能增加控制器前,沒有生成該應用程式)。visual

studio express 會建立以下檔案和檔案夾:

·

項目控制器檔案夾中的moviescontroller.cs檔案。

· 項目視圖檔案夾下的 movie檔案夾。

· 在新的views\movies檔案夾中建立create.cshtml、

delete.cshtml、 details.cshtml、 edit.cshtml和index.cshtml

檔案。

visual studio自動建立 (建立、

讀取、 更新和删除) 操作方法,和相關的視圖檔案(crud 自動建立的操作方法和視圖檔案被稱為 scaffolding)。

現在您有了可以建立、清單、 編輯和删除電影entity 所有的web功能了。

運作應用程式,通過将/movies追加到浏覽器位址欄

url的後面,進而浏覽movies控制器。因為應用程式依賴于預設路由 ( app_start\routeconfig.cs

檔案中的定義),浏覽器請求http://localhost:xxxxx/movies将被路由到<code>movies</code>控制器預設的<code>index</code>

操作方法。換句話說,浏覽器請求http://localhost:xxxxx/movies等同于浏覽器請求http://localhost:xxxxx/movies/index。因為您還沒有添加任何内容,是以結果是一個空的電影清單。

建立電影

點選create

new連結。輸入有關電影的一些詳細資訊,然後單擊create按鈕。

注意:您可能無法在“價格”字段中輸入小數點或逗号。要支援非英語語言環境,小數點用逗号(","),和非美國英語的日期格式的jquery驗證,你必須包括globalize.js,和你的具體文化/

globalize.cultures.js的檔案(從)和javascript使用globalize.parsefloat的。在接下來的教程中,我将展示如何做到這一點。現在,隻需輸入整數,如10。

單擊create按鈕将使得窗體送出至伺服器,同時電影資訊也會儲存到資料庫裡,然後您會被重定向到/movies

的url,您可以在清單中看到剛剛建立的新電影。

建立一些更多的電影資料(movie entries)。

同時也可以嘗試點選編輯、詳細資訊和删除功能的連結。

打開controllers\moviescontroller.cs檔案,并找到生成的<code>index</code>方法。一部分電影控制器和<code>index</code>方法如下所示。

public

class moviescontroller : controller { private moviedbcontext db = new moviedbcontext();

//

get: /movies/public actionresult index() { return

向<code>movies</code>控制器請求,進而傳回<code>movies</code>電影資料庫表中的所有記錄,然後将結果傳遞給<code>index</code>視圖。下面是moviescontroller類中執行個體化電影資料庫上下文執行個體,如前面所述。電影資料庫上下文執行個體可用于查詢、

編輯和删除的電影。

private

moviedbcontext db = new

moviedbcontext();

在本系列前面教程中,您看到了使用<code>viewbag</code>對象,從控制器傳遞資料或對象給視圖模闆。<code>viewbag</code>是一個動态的對象,提供了友善的後期綁定(late-bound)方法将資訊傳遞給視圖。

mvc 還提供了傳遞強類型對象(strongly typed

objects)到視圖模闆的能力。這種強類型使得更好的在編譯時檢查您的代碼, 并在visual studio 編輯器中提供更加豐富的()。

當建立操作方法和視圖時, visual studio

中的scaffolding機制(也就是通過一個強類型的模型)使用了<code>moviescontroller</code>類和視圖模闆。

在controllers\moviescontroller.cs檔案中看一下生成的<code>details</code>方法。電影控制器裡的<code>details</code>方法如下所示。

actionresult details(int? id) { if (id == null) { return new

httpstatuscoderesult(httpstatuscode.badrequest); } movie movie

=

db.movies.find(id); if (movie

== null) { return httpnotfound(); } return

id參數一般是通過路由資料傳遞. 例如 會設定電影控制器的控制,該方法操作details并設定id為1。 你也可以通過一個查詢字元串(query

string) 的id如下: http://localhost:1234/movies/details?id=1

如果查找到了一個<code>movie</code>,<code>movie</code>

模型的執行個體會傳遞給detail視圖。

return

view(movie);

看一下views\movies\details.cshtml檔案裡的内容。

@model

mvcmovie.models.movie @{ viewbag.title = "details"; } &lt;h2&gt;details&lt;/h2&gt; &lt;div&gt; &lt;h4&gt;movie&lt;/h4&gt; &lt;hr /&gt; &lt;dl class="dl-horizontal"&gt;

&lt;dt&gt;

&lt;/dt&gt;

&lt;/dl&gt; &lt;/div&gt; &lt;p&gt;

&lt;/p&gt;

通過引入視圖模闆檔案頂部的<code>@model</code>語句,您可以指定該視圖期望的對象類型。當您建立電影控制器時,visual

studio 會将<code>@model</code>聲明自動包含到details.cshtml檔案的頂部:

mvcmovie.models.movie

此<code>@model</code>聲明使得控制器可以将強類型的<code>model</code>對象傳遞給view視圖,

進而您可以在視圖裡通路傳遞過來的強類型電影model。

例如,在details.cshtml模闆中,每部電影的字段,通過代碼傳遞了<code>displaynamefor</code>

和 html

helper通過強類型的<code>model</code>對象。create和edit方法還有視圖模闆都在傳遞電影的強類型模型對象。

看一下index.cshtml視圖模版和moviescontroller.cs中的<code>index</code>

方法。請注意這些代碼是如何在i<code>ndex</code>操作方法中,建立對象,并調用<code>view</code>方法的。

此代碼在控制器中傳遞<code>movies</code>清單給視圖:

當您建立電影控制器時,visual studio會自動包含

<code>@model</code>語句到index.cshtml檔案的頂部

@model ienumerable&lt;mvcmovie.models.movie&gt;

此<code>@model</code>聲明使得控制器可以将強類型的電影清單<code>model</code>對象傳遞給view視圖。例如,在index.cshtml模闆中,在強類型的<code>model</code>對象上使用<code>foreach</code>語句循環周遊電影清單:

@foreach (var item

in model) { &lt;tr&gt; &lt;td&gt;

&lt;/td&gt; &lt;td&gt;

&lt;/td&gt; &lt;th&gt;

&lt;/th&gt; &lt;td&gt;

&lt;/td&gt; &lt;/tr&gt;

因為<code>model</code>對象是強類型的

(是<code>ienumerable&lt;movie&gt;</code>對象),是以在循環中的每個<code>item</code>對象的類型是<code>movie</code>類型。好處之一是,這意味着您可以在代碼編譯時進行檢查,同時在代碼編輯器中支援更加全面的智能感覺:

entity framework code

first(代碼優先),如果檢測到不存在一個資料庫連接配接字元串指向了<code>movies</code>資料庫,會自動的建立資料庫。在app_data檔案夾中找一下,您可以驗證它已經被建立了。如果您看不到movies.mdf檔案,請在解決方案資料總管工具欄上,單擊顯示所有檔案按鈕,單擊重新整理按鈕,然後展開app_data檔案夾。

輕按兩下movies.mdf打開資料庫資料總管(server

explorer),然後展開表檔案夾(tables) 以檢視電影表。

注意:id旁邊的鑰匙圖示。預設情況下,ef将建立一個名為id的主鍵。欲了解更多ef和mvc資訊,請參閱tom

dykstra‘s的優秀教程。

在movies表上單擊滑鼠右鍵,并請選擇顯示表資料(show table

data)看您所建立的資料。

在movies表上單擊滑鼠右鍵,并請選擇打開表定義(open table

definition), 您将看到entity framework code first建立的表結構。

注意事項:

movies表映射到movie類的架構(schema)如何你前面建立的。entity framework code

first首先自動為您創造了這個架構(schema)基于movie class。當您完成後,通過右擊moviedbcontext,并選擇關閉連接配接。

(如果你不關閉連接配接,下一次運作項目,你可能會得到一個錯誤)。

現在,您可以在這個簡單清單頁面裡:顯示、編輯、更新、删除資料庫裡的資料了。在下一次的教程中,我們會繼續看看scaffolded自動生成的其它代碼。并添加一個<code>searchindex</code>方法和<code>searchindex</code>視圖,使您可以在資料庫中搜尋電影了。更多關于entity

framework with mvc, see .

上一篇: ajax 亂碼