來源:http://www.cnblogs.com/JimmyZhang/archive/2009/02/08/1371819.html 張子陽
原文連結:http://www.asp.net/learn/mvc/tutorial-04-cs.aspx
在這篇教程中,我示範了顯示一系列資料庫記錄的兩個方法。我示範了在一個HTML表格中格式化一系列資料庫記錄的兩個方法。首先,我示範了如何直接在視圖中格式化資料庫記錄。接下來,我示範了如何在格式化資料庫記錄時利用部分類。
1.1建立模型類
我們將要顯示Movies資料庫表中的一系列記錄。Movies資料庫表包含下面的列:
Column Name |
Data Type |
Allow Nulls |
Id |
Int |
False |
Title |
Nvarchar(200) |
False |
Director |
NVarchar(50) |
False |
DateReleased |
DateTime |
False |
為了表示Movies資料庫表,我們將利用Linq to SQL作為我們的資料訪問技術。換言之,我們將會使用LINQ to SQL來綁定我們的MVC模型類。
建立一系列LINQ to SQL類的最快辦法就是利用Visual Studio Object Relational Designer(Visual Studio 物件關聯式設計工具)。右鍵點擊Models檔案夾,選擇“Add(添加)”,“New Item(建立項)”,選擇Linq To Sql類模板,將這個類命名為Movie.dbml,並且點擊Add按鈕(1)。
圖1:建立LINQ to SQL類
在你建立完Movie Linq to Sql 類以後,會立即出現物件關聯式設計工具。你可以將資料庫表從伺服器瀏覽器(Server Explorer)視窗中拖曳到物件關聯式設計工具中,以便建立代表著特定資料庫表的Linq to Sql類。你需要將Movies資料庫表添加到物件關聯式設計工具中(2)。
圖2:使用物件關聯式設計工具
預設情況下,物件關聯式設計工具將會試圖建立一個類名,該類名是資料庫表名的單數版本。換言之,如果你有一個叫做Customers的資料庫表,那麼物件關聯式設計工具將會建立一個叫做Customer的類名。
通常,物件關聯式設計工具非常適合完成這件事。不幸的是,物件關聯式設計工具將資料庫表名Movies轉換為了Movy(很接近,但是錯的)。通過在設計器中的類名上點擊,並且將類名由Movy改為Movie,你可以很容易地修正這個問題。
最後,記得點擊“Save(儲存)”(磁碟片表徵圖)按鈕來儲存LINQ to SQL類。否則的話,LINQ to SQL類將不會由物件關聯式設計工具產生。
1.2 在控制器動作中使用LINQ to SQL
現在我們已經有了LINQ to SQL類,我們可以使用這些類從資料庫擷取資料。代碼清單1中的控制器類使用LINQ to SQL類擷取來自Movies資料庫表的記錄。
代碼清單1 – ControllersHomeController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers{
[HandleError]
public class HomeController : Controller {
public ActionResult Index() {
var dataContext = new MovieDataContext();
var movies = from m in dataContext.Movies
select m;
return View(movies);
}
}
}
代碼清單1中的Index()動作使用LINQ to SQL MovieDataContext類來擷取來自資料庫表中的電影。電影列表被傳遞給了Index視圖,作為ViewData.Model屬性的值。
1.3 在視圖中進行格式化
格式一系列資料庫記錄最簡單、但不一定是最好的辦法,就是直接在視圖中執行格式化。舉個例子,代碼清單2中的Index視圖在一個HTML表格中呈現了movie資料庫的記錄。
代碼清單2 – ViewsHomeIndex.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %> <%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<table>
<tr>
<th>Id</th><th>Title</th><th>Release Date</th>
</tr> <% foreach (Movie m in (IEnumerable)ViewData.Model) { %>
<tr> <td><%= m.Id %></td>
<td><%= Html.Encode(m.Title) %></td>
<td><%= m.DateReleased %></td>
</tr>
<% } %>
</table>
</asp:Content>
代碼清單2中的視圖包含了一個foreach迴圈,該迴圈遍曆了movie記錄集中的每一個記錄。Movie的每一個屬性值都顯示在了各自的表格儲存格中。表格的行由HTML <tr>標籤建立,表格儲存格由HTML <td>標籤建立。
注意到Html.Encode()協助方法用於在顯示每個屬性值之前對其進行編碼。任何時候當你接受使用者輸入,並且將輸入重新顯示在網頁上時,對輸入進行編碼以阻止JavaScript注入攻擊都是很重要的。當你對顯示HTML內容前對它進行編碼漠不關心時,駭客便可以做一些惡毒且邪惡的事情,例如從你的網站使用者中盜取私人資料。
當你運行應用程式,Index視圖會呈現3所示的頁面。
圖3:使用HTML表格格式化了的資料庫記錄
圖3中HTML表格的格式化並不那麼令人興奮。我們可以通過建立層疊樣式表來改進HTML表格的外觀。因為代碼清單2中的視圖是一個content視圖,我們必須將層疊樣式表添加到與content視圖相關聯的模板頁中。這個模板頁位於下面路徑:
ViewsSharedSite.master
為了改進HTML表格的外觀,我們可以將代碼清單3中的樣式表添加到模板頁<head>的開閉標籤之間。
代碼清單3 – 層疊樣式表
<style type="text/css"> table { border-collapse:collapse; }
table td, table th { border: solid 1px black; padding:10px; } </style>
代碼清單3中的樣式表將儲存格之間的邊框合并起來,並且添加了網格(gridlines)。在你將這個樣式表添加到模板頁之後,Index視圖呈現出圖4中的頁面。
圖4:使用了樣式的HTML表格
1.4 在局部中格式化
除了在視圖本身中執行所有的格式化以外,你可以使用局部頁面(partial)作為一個模板來格式化每一個資料庫記錄。舉個例子,代碼清單4中的局部頁面代表著對於一個特定movie資料庫記錄的格式化。
代碼清單4 –ViewsMoviesMovieTemplate.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MovieTemplate.ascx.cs" Inherits="MvcApplication1.Views.Movies.MovieTemplate" %> <tr> <td> <%=ViewData.Model.Id%></td> <td> <%=Html.Encode(ViewData.Model.Title)%></td> <td> <%=ViewData.Model.DateReleased.ToString("D")%></td> </tr>
代碼清單4中的模板將每個movie記錄格式化為一個HTML表格行。模板應用到每一個資料庫記錄上。注意到ViewData.Model屬性,位於局部頁面中,代表著單個資料庫記錄,而不是所有的資料庫記錄集。
為了將ViewData.Model屬性轉換為Movie類的執行個體,你需要為這個局部頁面建立一個代碼後置類。代碼清單5中的代碼後置類指定了MovieTemplate部分類繼承自一個泛型類,該泛型類將Movie作為它的型別參數。
代碼清單5 - ViewsMoviesMovieTemplate.ascx.cs
using MvcApplication1.Models;
namespace MvcApplication1.Views.Movies {
public partial class MovieTemplate : System.Web.Mvc.ViewUserControl<Movie>
{ }
}
MovieTemplate類繼承自ViewUserControl<movie>類。因為MovieTemplate類繼承自這個類,ViewData.Model屬性自動轉換為Movie。
代碼清單6中的Index視圖示範了如何在視圖中使用MovieTemplate部分類。Html.RenderPartial()方法用於呈現MovieTemplate局部頁面。
代碼清單 6 – ViewsMoviesIndex.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Movies.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<table>
<tr>
<th>Id</th><th>Title</th><th>Release Date</th> </tr>
<% foreach (Movie m in (IEnumerable)ViewData.Model)
{ Html.RenderPartial("MovieTemplate", m); } %>
</table>
</asp:Content>
在代碼清單6中,Html.RenderPartial()方法用於為每個Movie記錄呈現MovieTemplate局部頁面。兩個參數傳遞給了RenderPartial()方法。第一個參數是將要呈現的局部頁面的名稱。和視圖一樣,預設情況下,局部頁面必須位於ViewsControlName 檔案夾或者是 ViewsShared檔案夾。
第二個參數指定了傳遞給部分的視圖資料。在局部頁面內部,ViewData.Model屬性將會代表一個特定的Movie記錄。
還有一個重要的警告。與大多數其他協助方法不同,Html.RenderPartial()方法並不會返回一個字串。這意味著你不能像下面這樣調用RenderPatial()方法:
<%= Html.RenderPartial("MovieTemplate", m) %>
相反,你應該這樣調用這個方法:
<% Html.RenderPartial("MovieTemplate", m) %>
RenderPartial()方法完成了一些事情,但它不會表示出來。
1.5 小結
這篇教程的目的是示範如何在一個HTML表格中顯示一系列的資料庫記錄。我們探索了格式化資料庫記錄的兩個方法。首先,我們直接在一個視圖中格式化資料庫記錄。接下來,我們使用一個局部頁面作為模板來格式化每一個資料庫記錄。