65.9K
CodeProject 正在变化。 阅读更多。
Home

演练:使用 ASP.NET 表示层创建 N 层数据应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (7投票s)

2011年12月2日

CPOL

12分钟阅读

viewsIcon

49914

downloadIcon

1998

如何使用 ASP.NET 表示层创建 N 层数据应用程序

引言

概述

越来越多的客户要求他们的数据接口是基于 Web 的,而不是基于 Windows 窗体。MSDN 上有一篇文章,地址为 http://msdn.microsoft.com/en-us/library/bb384570.aspx,其中概述了创建基本 N 层数据应用程序所需的步骤。但是,与使用 Windows 窗体相比,创建 ASP.NET 表示层有什么不同之处?

在本文中,我们将首先引导您完成上述演练,但最后三个步骤将有所不同,以便我们能够采用 ASP.NET 的数据展示应用程序实现路径,而不是 Windows 窗体。为了提供文本的连续性,本文中引用了上述文章的部分内容。在此演练中,您将

  • 创建一个将包含多个项目的新 N 层解决方案。
  • 向 N 层解决方案添加两个类库项目。
  • 使用 **数据源配置向导** 创建一个类型化数据集。
  • 将生成的 TableAdaptersdataset 代码分离到离散的项目中。
  • 创建一个 Windows Communication Foundation (WCF) 服务以调用数据访问层。
  • 在服务中创建方法以从数据访问层检索数据。
  • 创建一个使用 ASP.NET 的 Web 窗体应用程序作为表示层。
  • 创建绑定到数据源的 Web 窗体控件。
  • 编写代码以填充数据表。

为了实现我们的基于 Web 的方法,您将要做的不同步骤在上表中使用 **粗体** 突出显示。在开始之前,值得一提的是必要的先决条件。本文假设您使用 Microsoft Visual Studio 2010 和 ASP.NET 4 作为开发环境,并以 C# 作为代码隐藏语言。

必备组件

与前面引用的演练一样,您需要相同的先决条件。具体来说,请确保 Northwind 示例数据库已安装在您的本地 SQL Server Express 中,并且您可以访问它。

MSDN 上发布的文章 http://msdn.microsoft.com/en-us/library/8b6y4c7s.aspx 提供了有关如何获取 Microsoft 提供的示例数据库的详细说明。

执行之前的演练步骤

我将假定您知道如何执行 http://msdn.microsoft.com/en-us/library/bb384570.aspx 上的演练,并按照步骤进行,直到您准备创建基于 Windows 窗体的应用程序作为表示层。

准备进行此演练

要准备进行此演练,请先完成上述演练。但请在准备添加表示层之前停止。

准备进行此演练

  1. 转到 http://msdn.microsoft.com/en-us/library/bb384570.aspx
  2. 按照其中所述,创建一个包含多个项目的新 N 层解决方案。
  3. 向 N 层解决方案添加两个类库项目。
    • 将这两个项目命名为 DataAccessTierDataEntityTier,并按照上面引用的文档中的说明进行创建。
  4. 使用 **数据源配置向导** 从 CustomersOrders 表创建类型化数据集。
  5. 将生成的 TableAdaptersdataset 代码分离到离散的项目中。
    • 为此,请先将 dataset 添加到 DataAccessTier 项目,然后在 **解决方案资源管理器** 窗口中双击 .xsd 文件,接着在 **属性** 窗口中为 DataSet Project 属性选择 DataEntityTier
  6. 创建一个 Windows Communication Foundation (WCF) 服务以调用数据访问层。
  7. 在服务中创建方法以从数据访问层检索数据。

完成上述第 7 步后,您就可以使用 C# 和 ASP.NET 创建基于 Web 的表示层了。也可以使用 Visual Basic,但我选择的语言是 C#。在继续之前,请确保您的 **解决方案资源管理器** 如下图 1 所示。

创建 ASP.NET 表示层以显示数据服务中的数据

此时,**解决方案资源管理器** 窗口应接近图 1 所示的视图。它包含数据访问层、数据实体层以及 WCF 服务项目 DataService。现在我们将为项目创建表示层。

图 1. 包含数据访问层、数据实体层和 WCF 服务 DataService 的解决方案资源管理器。

创建 ASP.NET Web 应用程序作为表示层

创建 PresentationTier 项目

  1. 从 **文件** 菜单,向 NTierWalkthrough 解决方案添加一个新项目。
  2. 在 **新建项目** 对话框中,在 **项目类型** 窗格中,单击 **Web**。在 **模板** 窗格中,单击 ASP.NET Web 应用程序。
  3. 将项目命名为 PresentationTier
  4. 在 **解决方案** 下拉列表中,确保选择了 **添加到解决方案**,然后单击确定。
  5. PresentationTier 项目将被创建并添加到 NTierWalkthrough 解决方案中。

将表示层设置为启动项目

表示层是最终用户将看到的实际客户端应用程序。为了便于调试,让我们将其设置为 Visual Studio 中的启动项目,以便在从 Visual Studio 内部运行程序时加载您构建的网站。

将 PresentationTier 项目设置为启动项目

  • 在 **解决方案资源管理器** 中,右键单击 PresentationTier 项目的图标,然后单击 **设置为启动项目**。

PresentationTier 项目设置为启动项目后,其名称将以粗体显示在解决方案资源管理器中。

向表示层添加引用

为了调用我们的 WCF 服务,必须向 PresentationTier 项目添加引用。要添加访问数据库对象所需的引用,请完成以下步骤。必须同时添加对 DataService WCF 服务项目的服务引用,以及对 DataEntityTier 层的引用。第二个引用是为了通过包含 DataSet 设计器生成的部分数据库类来实现 WCF 服务与客户端之间的“类型共享”。

向表示层添加引用

  1. 在 **解决方案资源管理器** 中,右键单击 PresentationTier,然后单击 **添加引用**。
  2. 在 **添加引用** 对话框中,单击 **项目** 选项卡。
  3. 选择 DataEntityTier,单击 **添加**,然后单击 **关闭**。

向表示层添加服务引用

  1. 在 **解决方案资源管理器** 中,右键单击 PresentationTier,然后单击 **添加服务引用**。
  2. 在“添加服务引用”对话框中,单击 **发现**。
  3. 选择 DataService.svc,然后在 **命名空间** 框中键入 DataServiceReference
  4. 点击**确定**。

重新生成解决方案以更新引用信息

Visual Studio 将在您生成后生成代码以启用您刚刚添加的引用。

  • 在 Visual Studio 中,单击 **生成** 菜单,然后单击 **重新生成解决方案**。

将 ASP.NET 表示层连接到数据

要将 ASP.NET Web 应用程序连接到数据,我们需要使用 ObjectDataSource,然后使用 ASP.NET DataGridView 来显示数据。

向表示层添加控件

第一个目标是准备 Default.aspx 页面,使其看起来如下图 2 所示。

图 2. 修改 Default.aspx 页面的起点。

准备 Default.aspx 页面以插入数据绑定控件

  1. 在 **解决方案资源管理器** 中,双击 Site.Master 文件。
  2. 按 CTRL+G,在 **行号** 框中键入 17,然后单击 **确定**。
  3. 您应该会进入由 <div class="title"> 标签包围的代码段。
  4. 将网站标题从“My ASP.NET Web Application”更改为“Presentation Tier”。
  5. 关闭 Site.Master 文件并保存更改。
  6. 在 **解决方案资源管理器** 中,双击 Default.aspx 文件。
  7. 切换到 **设计** 模式。
  8. 单击图 2 中所示的 <p> 元素,然后删除其中的所有文本。这里我们将添加控件。
  9. 在 **工具箱** 窗口中,打开 **数据** 选项卡,然后将 ObjectDataSource 控件从工具箱拖到您的 Default.aspx 页面上。
  10. 右键单击刚刚添加的 ObjectDataSource 控件,然后从菜单中选择 **属性**。
  11. 在属性窗口的 **(ID)** 字段中,将控件命名为 CustomersDataSource
  12. 从工具箱将另一个 ObjectDataSource 拖到页面上,并将其命名为 OrdersDataSource

接下来,我们将配置 ObjectDataSource 控件以连接到我们的数据。

访问获取 Customers 表数据的 WCF 方法

  1. 右键单击 CustomersDataSource 控件,然后从菜单中选择 **配置数据源…** 打开配置数据源向导。
  2. 在“选择业务对象”页面上,将“仅显示数据组件”复选框留空。
  3. 在“选择业务对象”下拉列表中,选择 PresentationTier.DataServiceReference.DataServiceClient 对象。
  4. 单击“下一步”。
  5. 在“定义数据方法”页面的 SELECT 选项卡上,在“选择方法”下拉列表中选择 GetCustomers(),返回 CustomersDataTable
  6. 单击“完成”。

访问获取 Orders 表数据的 WCF 方法

  1. 右键单击 OrdersDataSource 控件,然后从菜单中选择 **配置数据源…** 打开 **配置数据源** 向导。
  2. 与之前一样,将 **仅显示数据** 组件复选框留空。
  3. 在 **选择业务对象** 下拉列表中,选择 PresentationTier.DataServiceReference.DataServiceClient 对象。
  4. 点击**下一步**。
  5. 在“定义数据方法”页面的 **SELECT** 选项卡上,在 **选择方法** 下拉列表中选择 GetOrders(),返回 OrdersDataTable
  6. 点击**完成**。

管理页面生命周期中的 ASP.NET 到 WCF 服务连接状态

作为访问高度依赖状态的 WCF 体系结构与无状态系统(如 ASP.NET 页面)的额外步骤,您必须添加自定义代码以在页面生命周期中打开、关闭和管理与 WCF 服务的连接。

管理 WCF 客户端连接状态和消息大小

  1. 右键单击 CustomersDataSource 控件,然后选择 **属性**。
  2. 在 **属性** 窗口中,单击 **事件** 按钮。
  3. 双击 ObjectCreatingObjectDisposing 事件以在 Default.aspx.cs 文件中添加处理程序。
  4. OrdersDataSource 控件重复上述步骤。
  5. 在 **解决方案资源管理器** 中,双击 Default.aspx.cs 文件。
  6. _Default partial 类的顶部,添加下图中 **粗体** 显示的代码行:
    namespace PresentationTier
    {
        public partial class _Default : System.Web.UI.Page
        {
            DataServiceReference.DataServiceClient _dataClient = null;
    
            //...
        }
    }
  7. 按如下方式实现页面的 Page_Load 处理程序:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (_dataClient == null)
        {
            _dataClient = new DataServiceReference.DataServiceClient();
            _dataClient.Open();
        }
    }
  8. _Default 类中创建一个新方法并命名为 InitializeDataConnection()。使新方法返回 void 并将其设为 private 方法。按如下方式实现它:
    private void InitializeDataConnection(ref ObjectDataSourceEventArgs e)
    {
        // set the object instance
        if (_dataClient.State == System.ServiceModel.CommunicationState.Opened)
            e.ObjectInstance = _dataClient;
    }
  9. 按如下方式实现 CustomersDataSourceOrdersDataSourceObjectCreating 事件处理程序:
    protected void CustomersDataSource_ObjectCreating(object sender, 
    ObjectDataSourceEventArgs e)
    {
        InitializeDataConnection(ref e);
    }
    
    protected void OrdersDataSource_ObjectCreating(object sender, 
    ObjectDataSourceEventArgs e)
    {
        InitializeDataConnection(ref e);
    }
  10. 在类中添加一个名为 CloseDataConnection() 的新的 private 方法,并按如下方式实现它:
    private void CloseDataConnection(ref ObjectDataSourceDisposingEventArgs e)
    {
        // set this so the object is not disposed afterwards
        e.Cancel = true;
    }
  11. 按如下方式实现 CustomersDataSourceOrdersDataSource 控件的 ObjectDisposing 事件处理程序方法:
    protected void CustomersDataSource_ObjectDisposing(object sender, 
    ObjectDataSourceDisposingEventArgs e)
    {
        CloseDataConnection(ref e);
    }
    
    protected void OrdersDataSource_ObjectDisposing(object sender, 
    ObjectDataSourceDisposingEventArgs e)
    {
        CloseDataConnection(ref e);
    }
  12. 在解决方案资源管理器中,在 PresentationTier 项目下,双击其 web.config 文件。
  13. 确保绑定标签(大约第 58 行)中的 maxBufferSizemaxBufferPoolSizemaxReceivedMessageSize 属性都具有值 6553600

现在,我们可以开始在窗体上放置一些 GridView 控件来显示我们的 CustomersOrders 表结果了。

将 Customers 和 Orders GridView 添加到 ASP.NET 窗体并修改窗体样式以使 GridView 适合页面

向窗体添加 GridView 以显示 Customers 表

  1. 在 **解决方案资源管理器** 中,双击 Default.aspx.cs 文件将其打开。将插入点放在 OrdersDataSource 控件之后。
  2. 在 **工具箱** 中,展开“数据”选项卡,然后将 GridView 控件拖到页面上。
  3. 单击 GridView 上的智能标记以打开其 GridView 任务菜单。
  4. 在 **选择数据源** 下拉列表中,单击 CustomersDataSource
  5. 根据需要选择您可能希望用于新控件的其他选项。
  6. 右键单击 GridView,然后从菜单中选择 **属性** 将焦点设置在属性窗口上。
  7. 在 (ID) 框中,删除现有的 GridView1 默认值,键入 CustomersGridView,然后按键盘上的 ENTER 键。
  8. 将插入点设置在 GridView 正上方,然后键入文本以给 GridView 添加标题,例如 Customers:

向窗体添加 GridView 以显示 Orders 表

  1. 将插入点放在 CustomersGridView 控件之后,然后按两次回车键。
  2. 键入文本 Orders:
  3. 从工具箱将另一个 GridView 拖到窗体上。
  4. 单击新的 GridView 的智能标记,然后在“选择数据源”下拉列表中单击 OrdersDataSource
  5. 右键单击新的 GridView,然后选择 **属性** 以显示属性窗口。
  6. 在 **(ID)** 框中,删除默认文本,键入 OrdersGridView,然后按键盘上的 ENTER 键。
  7. 保存您的更改。

Orders 表比 Customers 表有更多的列,因此,它的 GridView 将会太宽,无法适应 Visual Studio 模板提供的预建 ASP 网站页面的矩形区域。我们需要进入网站的级联样式表 (CSS) 文件并修改一个设置,以便页面宽度能够容纳我们的数据。

调整 CSS 样式表以使 Orders 表适合页面

  1. 在 **解决方案资源管理器** 中,展开 PresentationTier 项目,展开 Styles 文件夹,然后双击 Site.css 文件。
  2. 按 CTRL+G 显示“转到”对话框。
  3. 在“行号”框中,键入 **89**,然后按 ENTER。
  4. .pages CSS 类中,将 width: style 参数更改为 1200px
  5. 保存您的更改。

运行站点以预览新表

现在您拥有一个功能齐全的 N 层数据应用程序,它连接到 Northwind 数据库,从 CustomersOrders 表中检索所有数据,然后将其作为表示层显示在 Web 窗体中。

运行网站以预览表示层

  1. 在 **生成** 菜单上,单击 **重新生成解决方案**。
  2. 在 **调试** 菜单上,单击 **开始**,或按键盘上的 F5 键。

Visual Studio 会在浏览器中加载您的 Web 应用程序表示层,同时也会加载并托管 WCF 服务器,并连接到您的数据。完成后,结果应如下所示:

Click to enlarge image

图 3. 显示我们基于 Web 的表示层的 Web 浏览器。

结论

在本文中,我们改编和扩展了 Microsoft 发布的关于创建 N 层数据应用程序的教程。我们文章的关键区别在于,我们没有使用 Windows 窗体来显示表示层中的数据,而是使用 ASP.NET Web 应用程序来显示数据。步骤大体相同,关键区别在于我们需要添加代码来处理 ObjectDataSource 控件的 ObjectCreatingObjectDisposing 事件,以管理我们 GridView 的 WCF 连接状态。

历史

  • 2011 年 12 月 1 日:初始版本
© . All rights reserved.