显示数据库表中的数据

这是 Visual C# 教程 (转到 Visual Basic 教程

在本教程中,作者介绍了两种显示数据库记录集的方法。作者展示了两种在 HTML 表中格式化一组数据库记录的方法。首先,作者介绍了如何直接在视图中格式化数据库记录。接着,作者介绍了格式化数据库记录时如何利用 Partial。

« 前一篇教程  |  下一篇教程 »

显示数据库表中的数据

在本教程中,作者介绍了两种显示数据库记录集的方法。展示了两种在 HTML 表中格式化一组数据库记录的方法。首先,介绍了如何直接在视图中格式化数据库记录。接着,介绍了格式化数据库记录时如何利用 Partial。

创建 Model 类

我们将显示 Movies 数据库表中的记录集。Movies 数据库表包含下面的列:

列名称

数据类型

允许空值

Id

Int

False

Title

Nvarchar(200)

False

Director

NVarchar(50)

False

DateReleased

DateTime

False

为了表示 Movies 数据库表,我们将利用 LINQ to SQL 作为数据库访问技术。换句话说,我们将使用 LINQ to SQL 构建 MVC Model 类。

要创建一组 LINQ to SQL 类,最快的方法是利用 Visual Studio Object Relational Designer。右键单击 Models 文件夹,选择 Add,New Item,选择 LINQ to SQL Classes 模板,将类命名为Movie.dbml,然后单击Add按钮(如图 1 所示)。

图 1:创建 LINQ to SQL 类(单击查看大图

创建 Movie LINQ to SQL 类之后,Object Relational Designer 将立即出现。可以将数据库表从 Server Explorer 窗口拖到 Object Relational Designer 上,以创建代表特殊数据库表的 LINQ to SQL 类。我们需要将 tblMovie 数据库表添加到 Object Relational Designer 上(如图 2 所示)。

图 2:使用 Object Relational Designer(单击查看大图

默认情况下,Object Relational Designer 将试图创建一个类名,该名称是数据库表名称的单数版本。换句话说,如果数据库表名称为Customers,则 Object Relational Designer 将创建的表名称为 Customer

通常 Object Relational Designer 善于命名。不幸的是,Object Relational Designer 将数据库表名称 Movies 转换为 Movy(很接近,但是不正确)。可以轻松修正此问题,方法是单击设计器中的类名,然后将类名从 Movy 更改为 Movie。

最后,要记住单击 Save 按钮(软盘图标)保存 LINQ to SQL 类。否则,Object Relational Designer 将不会生成 LINQ to SQL 类。

在控制器操作中使用 LINQ to SQL

生成 LINQ to SQL 类之后,我们可以使用这些类从数据库中检索数据。程序清单 1 中的控制器类使用 LINQ to SQL 类从 Movies 数据库表中检索电影记录。

程序清单 1Controllers\HomeController.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 类从数据库表中检索电影。电影列表被作为 ViewData.Model 属性的值传递到 Index 视图。

在视图中格式化

要格式化数据库记录集,最简单的方法(但不是最好的)是直接在视图中执行格式化。例如,程序清单 2 中的 Index 视图在 HTML 表中呈现电影数据库记录。

程序清单 2 Views\Home\Index.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 循环。每个电影的属性值显示在单独的表格中。表行使用 HTML<tr>标记创建,而表的单元格使用 HTML<td> 标记创建。

请注意,Html.Encode() Helper 方法用于在显示之前编码每个属性值。每当接受用户输入并重新将输入显示到 Web 页面时,对输入的内容进行编码很重要,这样可以阻止 JavaScript 注入攻击。如果在显示内容前不注意使用 HTML 编码,则黑客可能会利用这种漏洞搞破坏活动,如窃取网站用户的私密数据。

在运行应用程序时,Index 视图如图 3 中的页面所示。

图 3:使用 HTML 表格式化的数据库记录(单击查看大图

图 3 中,HTML 表的格式不是很好。我们可以通过创建层叠样式表 (Cascading Style Sheet, CSS) 改进 HTML 表的外观。由于程序清单 2 中的视图是一个内容视图,因此必须向主页添加与内容视图相关的 CSS。此主页位于以下路径:

\Views\Shared\Site.master

为了改进 HTML 表的外观,可以将程序清单 3 中的样式表添加到主页上开始和结束<head>标记之间。

程序清单 3 Cascading Style Sheet

<style type="text/css">
table
{
     border-collapse:collapse;
}

table td, table th { border: solid 1px black; padding:10px; } </style>

程序清单 3 中的样式表将单元格之间的边界进行重叠并添加了网格。将此格式表添加到主页后,Index 视图呈现的页面如图 4 所示。

图 4:带有样式的 HTML 表(单击查看大图

在 Partial 中格式化

除了在视图自身中执行格式化以外,还可以使用 Partial 作为模板来格式化数据库记录。例如,程序清单 4 的 Partial 表示特定电影数据库记录的格式。

程序清单 4\Views\Movies\MovieTemplate.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 中的模板将每个电影记录格式化为一个 HTML 表行。模板被应用于每个数据库记录。请注意 Partial 内的 ViewData.Model 属性,它表示单个数据库记录,而不是所有数据库记录。

为了将 ViewData.Model 属性应用于 Movie 类的实例,需要为 Partial 创建代码隐藏的类。程序清单 5 中代码隐藏的类指出,MovieTemplate Partial 继承自以类型 Movie 作为类型参数的普通类。

程序清单 5 \Views\Movies\MovieTemplate.ascx.cs

using MvcApplication1.Models;
namespace MvcApplication1.Views.Movies
{
     public partial class MovieTemplate : System.Web.Mvc.ViewUserControl<Movie>
     {
     }
}

可以打开视图的代码隐藏类,方法是右键单击视图并选择 Solution Explorer 窗口中的菜单选项 View Code。

程序清单 5 中的 MovieTemplate 类继承自(Movie 的)ViewUserControl 类。因为 MovieTemplate 类继承自该类,所以 ViewData.Model 属性被自动分配给 Movie。

程序清单 6 中的 Index 视图说明了如何在视图中使用 MovieTemplate Partial。Html.RenderPartial() 方法用于呈现 MovieTemplate Partial。

程序清单 6 \Views\Movies\Index.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 Partial。有两个参数传递到 RenderPartial() 方法。第一个参数是要呈现的 Partial 的名称。与视图一样,默认情况下,Partial 必须位于 Views\ControllerName 文件夹或 Views\Shared 文件夹中。

第二个参数指定传递到 Partial 的视图数据。在 Partial 中,ViewData.Model 属性代表特定的 Movie 记录。

需要重点强调的是,Html.RenderPartial() 方法不同于其他 Helper 方法,它不返回字符串。这意味着,不能按以下方式调用 RenderPartial() 方法:

<%= Html.RenderPartial("MovieTemplate", m) %>

而是应该按照下面的方式调用方法:

<% Html.RenderPartial("MovieTemplate", m); %>

RenderPartial() 执行某些内容,而不是表达某些内容。

总结

本教程的目的是向读者介绍如何在 HTML 表中显示一组数据库记录。我们探讨了两种格式化数据库记录的方法。第一种方法是直接在视图中格式化数据库记录。第二种方法是使用 Partial 作为模板格式化每个数据库记录。