本教程的目的是向你介绍如何在ASP.NET MVC程序里显示一个数据库数据的HTML表格。首先,介绍了如何直接在视图中格式化数据库记录。接着,介绍了格式化数据库记录时如何利用 Partial。

创建模型类

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


列名称

数据类型

允许空值

Id

Int

False

Title

Nvarchar(200)

False

Director

NVarchar(50)

False

DateReleased

DateTime

False

 

为了在我们的ASP.NET MVC程序中表示Movies表,我们需要创建一个模型类。在这篇教程中,我们使用 Microsoft Entity Framework 来创建。


然而, 明白很重要的一点是,你可以在ASP.NET MVC程序中使用各种不同的技术来与数据库交互,包括 LINQ to SQL, NHibernate, 或者ADO.NET.


参照以下步骤启动实体数据模型向导:

  1. 在解决方案资源管理器上右键 Models 文件夹,选择“添加”,“新建项”。
  2. 选择“数据”分类,选择 ADO.NET Entity Data Model 模板。
  3. 为你的数据模型命名为 MoviesDBModel.edmx 点击“添加”按钮。

点击“添加”按钮后,将出现“实体数据模型向导”对话框 (见图 1). 参照以下步骤完成向导:

  1. 在 选择模型对象 这一步, 选择 从数据库生成 选项.
  2. 在 选择你的数据连接 这一步, 使用 MoviesDB.mdf 数据连接并命名为 MoviesDBEntities。 点击 下一步 按钮。
  3. 在 选择你的数据库对象 这一步, 展开“表”节点, 选择 Movies 表。输入命名空间 Models 点击 完成 按钮。

 




图01: 创建 LINQ to SQL 类(点击查看完整大小)


完成“实体数据模型向导”后,“实体数据模型设计器”出现。设计器将显示 Movies 实体 (见图 2).




图02: 实体数据模型设计器(点击查看完整大小)


在继续之前我们要做点小改动。实体数据向导生成的模型类名为 Movies 用以表示 Movies 数据库表。由于我们用 Movies 类来表示一个特定的电影,所以我们要把类名改为 Movie 而不是 Movies (单数而不是复数).

在设计器界面上双击类名并将类名从Movies改为 Movie。更改完后,点击 保存 按钮 (软盘图标) 来生成 Movie 类。

创建 Movies 控制器

既然我们已经可以表示我们的数据库记录了,那么就可以创建控制器来返回电影的集合了。在 Visual Studio 解决方案资源管理器窗口中,右键点击 Controllers 文件夹并选择菜单项 添加, Controller (见图3).




图03:添加 Controller 菜单(点击查看完整大小)


 Add Controller 对话框显示后, 输入控制器名 MovieController (见图4). 点击 Add 按钮添加新控制器。




图04: Add Controller 对话框(点击查看完整大小)


我们需要修改Movie控制器暴露的 Index() 操作以返回一组数据库记录。见代码1。

代码1 – Controllers/MovieController.cs


using System.Linq;

using System.Web.Mvc;

using MvcApplication1.Models; 

namespace MvcApplication1.Controllers

{

    public class MovieController : Controller

    {

        //

        // GET: /Movie/ 

        public ActionResult Index()

        {

            var entities = new MoviesDBEntities();

            return View(entities.MovieSet.ToList());

        } 

    }

}


在代码 1,  MoviesDBEntities 类用来表示 MoviesDB 数据库。 要使用这个类,你需要导入 MvcApplication1.Models 命名空间:

using MvcApplication1.Models;

表达式 entities.MovieSet.ToList() 从Movies数据库表返回一组所有的电影。

创建视图

在HTML表格显示一组数据库记录的最简单方法是利用Visual Studio提供的脚手架。

选择菜单项 生成, 生成解决方案 运行你的程序。在打开 Add View 对话框之前你必须生成你的程序,否则你的数据类不会显示在对话框中。

 

在 Index() 操作上右键,选择菜单项 Add View (见图 5).




图05: 添加视图(点击查看完整大小)

Add View 对话框中, 勾选上 Create a strongly-typed view. 选择 Movie 类作为 view data class. 选择 List 作为 view content (见图 6). 选择这些选项将生成一个显示一组电影的强类型视图。




图06:  Add View 对话框(点击查看完整大小)


点击 Add 按钮, 代码 2 的视图自动生成。这个视图包含了需要遍历movies集合和显示movie每个属性的代码。

代码2 – Views/Movie/Index.aspx


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.Movie>>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">

      Index

</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Index</h2> 

    <table>

        <tr>

            <th></th>

            <th>

                Id

            </th>

            <th>

                Title

            </th>

            <th>

                Director

            </th>

            <th>

                DateReleased

            </th>

        </tr> 

    <% foreach (var item in Model) { %>

   

        <tr>

            <td>

                <%= Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |

                <%= Html.ActionLink("Details", "Details", new { id=item.Id })%>

            </td>

            <td>

                <%= Html.Encode(item.Id) %>

            </td>

            <td>

                <%= Html.Encode(item.Title) %>

            </td>

            <td>

                <%= Html.Encode(item.Director) %>

            </td>

            <td>

                <%= Html.Encode(String.Format("{0:g}", item.DateReleased)) %>

            </td>

        </tr>

   

    <% } %> 

    </table> 

    <p>

        <%= Html.ActionLink("Create New", "Create") %>

    </p> 

</asp:Content>


你可以选择菜单项 调试, 启动调试 (或按F5建)来运行你的程序。运行程序将启动 Internet Explorer。如果你导航至 /Movie URL 那么你会看到如图7的页面。




图07: 电影表(点击查看完整大小)


如果你不喜欢图7中关于数据库表格的样式那么你可以简单地修改 Index 视图。例如,你可以将 DateReleased 表头改为 Date Released

用Partial创建模板

当视图变得太复杂,将视图分解为部分是个好主意。使用partials使你的视图更易懂且更易维护。我们将创建一个partial作为模板来格式化每个 movie 数据库记录。

参照以下步骤创建 partial:

  1. 右键点击 Views/Movie 文件夹选择菜单项 Add View.
  2. 勾选 Create a partial view (.ascx).
  3. 命名为 MovieTemplate.
  4. 勾选 Create a strongly-typed view.
  5. view data class 中选择Movie类。
  6. view content 选择Empty。 
  7. 点击 Add 按钮添加 partial 到你的项目中。

完成这些步骤后,修改 MovieTemplate partial 使它如 代码 3.

代码3 – Views/Movie/MovieTemplate.ascx


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcApplication1.Models.Movie>" %> 

<tr>

    <td>

        <%= Html.Encode(Model.Id) %>

    </td>

    <td>

        <%= Html.Encode(Model.Title) %>

    </td>

    <td>

        <%= Html.Encode(Model.Director) %>

    </td>

    <td>

        <%= Html.Encode(String.Format("{0:g}", Model.DateReleased)) %>

    </td>

</tr>


代码3 中的partial包含一行记录的模板。

代码4中修改后的 Index 视图使用 MovieTemplate partial.

代码4 – Views/Movie/Index.aspx


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.Movie>>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Index</h2> 

    <table>

        <tr>

            <th>

                Id

            </th>

            <th>

                Title

            </th>

            <th>

                Director

            </th>

            <th>

                DateReleased

            </th>

        </tr> 

    <% foreach (var item in Model) { %>

   

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

   

    <% } %> 

    </table> 

</asp:Content>


代码4中的视图包含一个 foreach 循环,遍历所有movies。对于每一个movie,MovieTemplate partial 用来格式化电影。MovieTemplate 通过调用 RenderPartial() helper方法呈现。

修改后的 Index 视图呈现了完全相同的数据库记录的HTML表。然而,视图却被大大地改变了。


RenderPartial() 方法与其它大多数 helper 方法不同,因为它不返回一个字符串。因此,你必须用<% Html.RenderPartial(); %> 而不是<%= Html.RenderPartial(); %> 来调用RenderPartial() 方法。