Asp.Net MVC 視圖(顯示資料庫資料表格) – Part.3

來源:互聯網
上載者:User

來源: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表格中顯示一系列的資料庫記錄。我們探索了格式化資料庫記錄的兩個方法。首先,我們直接在一個視圖中格式化資料庫記錄。接下來,我們使用一個局部頁面作為模板來格式化每一個資料庫記錄。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.