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

一位初学者的ASP.NET动态数据入门指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (49投票s)

2012年5月2日

CPOL

7分钟阅读

viewsIcon

320597

downloadIcon

8583

ASP.NET动态数据网站简介。

引言

本文是一篇面向初学者的ASP.NET动态数据网站教程。本文简要介绍ASP.NET动态数据,并实现了一个小型动态数据网站进行解释。

背景

互联网上有相当多的网站和大量的内网应用主要提供操作数据库的用户界面。这些网站通常被开发为ASP.NET表单,用于检索、插入和更新数据。借助ASP.NET动态数据网站,创建这类以数据为中心的Web应用程序变得非常容易。动态数据网站在创建网站管理门户方面也非常有用,管理员可以通过ASP.NET动态数据项目创建的基于Web的界面轻松访问数据库。

动态数据网站运行在Microsoft的脚手架框架之上。动态数据网站的基本思想是,一旦我们准备好数据库,就可以使用“LINQ to SQL”或“Entity Framework”为该数据库创建数据上下文。准备好数据上下文后,我们就可以使用它,并且执行数据库操作的网页将在运行时生成。需要注意的是,动态数据网站是在运行时生成页面,而不是Visual Studio自动生成的代码。它确实使用了一些模板页面和控件来渲染实际数据,这实际上是一件好事,因为它为我们提供了根据需求进行定制的可能性。

如果我们尝试可视化动态数据网站的高层架构

dynamic data article image

解决方案

让我们通过一个小例子来理解如何创建和自定义动态数据网站。我们将使用一个名为LaptopShop的小数据库。该数据库只有两个表。我们将尝试通过创建一个动态数据网站来访问这个简单的数据库。

dynamic data article image

创建动态数据网站

让我们开始创建一个新的动态数据网站。我们可以创建一个动态数据网站或一个动态数据项目。创建动态数据网站后,我们首先要关注的是如何使用数据库。让我们将数据库放在APP_Data目录中。

接下来,我们需要通过使用LINQ to SQL或Entity Framework来添加数据源映射。在本文中,我们将使用Entity Framework。无论在这里选择哪种类型,基本原理都将保持不变。

dynamic data article image

Entity Framework已经为我们的数据库创建了数据上下文和实体。

dynamic data article image

接下来,我们需要查看global.asax文件。该文件包含渲染页面所有路由机制的代码。在这里,我们需要指定我们的数据上下文,以便它可以在这个动态数据网站中使用。

dynamic data article image

请注意,我将scaffoldAllTables设置为true。这意味着我希望所有表和所有列都按原样渲染,并且一旦我们运行应用程序,就可以操作网站上的所有字段。

应用程序的主页面显示表的列表

dynamic data article image

从应用程序中查看的Laptop表

dynamic data article image

请注意,动态数据站点足够智能,能够识别表之间的关系,并为我提供了利用这些关系进行更好管理的可能性。

从应用程序中查看的Manufacturer表显示了与Laptop表的关联

dynamic data article image

在插入新数据时,我可以以有意义的方式使用表之间的关系

dynamic data article image

查看数据库中的选定表

到目前为止,我们已经为我们创建了动态数据网站,但它显示了所有表。如果我们不想显示某些表怎么办?如果我们只想查看数据库中的少数几个表,那么我们就必须掌握脚手架控件。所以我们首先需要禁用默认的脚手架,如下所示:

DefaultModel.RegisterContext(typeof(testDbEntities), new ContextConfiguration() { ScaffoldAllTables = false });

现在,动态网站的思路是,运行时将检查所有表的脚手架状态,然后决定应该向用户渲染哪个表。我们需要有关表和脚手架状态的信息。因此,如果我们关闭了默认脚手架,我们将不得不更改生成的实体类,以便在页面上渲染自定义表。

这样做的问题是,即使我们更改了生成代码中的实体类,应用程序也不会起作用,因为当实体类再次生成时,我们的更改将丢失。所以我们不能更改生成类的代码。

生成的类是部分类,这是自定义这些类的关键。我们实际上可以在我们的App_Code文件夹中拥有同名的部分类,这个类将与生成的类合并,从而有效地保留我们的更改。

因此,我们在某些表上启用了脚手架,并且需要为该表的实体类使用ScaffoldTable属性。假设我们只想显示Laptops表,那么我们需要为它创建一个部分类,并将ScaffoldTable属性设置为true。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace DynamicDataTest
{
    [ScaffoldTable(true)]   
    public partial class Laptop
    {
    }
}

现在,如果我们运行应用程序,我们将只能看到Laptops表,而看不到Manufacturer表。

dynamic data article image

因此,对于所有表,我们需要让用户能够从我们的动态数据网站上操作数据。让我们也为其他表这样做。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace DynamicDataTest
{
    [ScaffoldTable(true)]
    public partial class Manufacturer
    {
    }
}

查看表中的选定列

动态数据网站的默认设置负责不显示表单上的主键列,并以有意义的方式(即链接到相关表)显示外键列。但是,在某些情况下,我们可能只想向用户显示某些列。如果我们想这样做,我们将不得不为实体类定义一个元数据类,然后为我们不想在表单中显示的每一列设置ScaffoldColumn属性为false。

让我们从laptop表中删除processor列,看看效果如何。因此,代码将如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace DynamicDataTest
{
    [ScaffoldTable(true)]
    [MetadataType(typeof(LaptopMetadata))]
    public partial class Laptop
    {
    }

    public class LaptopMetadata
    {
        [ScaffoldColumn(false)]
        public global::System.String Processor;
    }
}

现在,如果我们运行应用程序,我们将不会在laptop表中看到processor列。

dynamic data article image

自定义字段模板

还剩一件事很重要,那就是控制我们网站的外观。动态数据网站使用页面模板和控件模板在运行时生成页面。如果我们想改变网站的外观,我们可以改变这些模板,或者拥有自己的模板并让它们与动态数据网站协同工作。

dynamic data article image

现在,我将添加一个新的控件来渲染数据的文本类型,然后将此控件与laptop表的屏幕尺寸列一起使用。要做到这一点,我需要添加一个字段模板并对其进行自定义。我只是在实际值前面添加一些静态文本来说明,但这些控件可以进行无限的可能性定制。

更改是默认文本控件

<%@ Control Language="C#" CodeBehind="Text2.ascx.cs" Inherits="DynamicDataTest.TextField2" %>
Value = 
<asp:Literal runat="server" ID="Literal1" Text="<%# FieldValueString %>" />

更改是编辑文本控件

<%@ Control Language="C#" CodeBehind="Text2_Edit.ascx.cs" Inherits="DynamicDataTest.Text2_EditField" %>
New value = 
<asp:TextBox ID="TextBox1" runat="server" Text='<%# FieldValueEditString %>' CssClass="DDTextBox"></asp:TextBox>

<asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" 
CssClass="DDControl DDValidator" ControlToValidate="TextBox1" Display="Static" Enabled="false" />

<asp:RegularExpressionValidator runat="server" ID="RegularExpressionValidator1" 
CssClass="DDControl DDValidator" ControlToValidate="TextBox1" Display="Static" Enabled="false" />

<asp:DynamicValidator runat="server" ID="DynamicValidator1" 
CssClass="DDControl DDValidator" ControlToValidate="TextBox1" Display="Static" />

最后,我将不得不使用我的laptops元数据类,通过实体类的属性上的UIHint属性来使用这个控件。完成后,我的类将看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace DynamicDataTest
{
    [ScaffoldTable(true)]
    [MetadataType(typeof(LaptopMetadata))]
    public partial class Laptop
    {
    }

    public class LaptopMetadata
    {
        [ScaffoldColumn(false)]
        public global::System.String Processor;

        [UIHint("Text2")]
        public global::System.String ScreenSize
        {
            get;
            set;
        }
    }
}

现在,当我们运行应用程序时,我们可以看到新的控件正在用于在视图和编辑模式下渲染屏幕尺寸字段。

dynamic data article image

dynamic data article image

因此,我们看到,通过自定义页面模板和字段模板,可以定制默认动态数据网站的外观。

关注点

我尝试通过这个小型应用程序来解释ASP.NET动态数据网站。有了动态数据网站,创建数据中心网站就非常容易了。有几点需要记住:

  • 可以使用“LINQ to SQL”或“Entity Framework”创建ASP.NET动态数据网站。
  • 可以使用部分类向实体类添加自定义属性,并对脚手架进行更精细控制。
  • 可以使用元数据类来控制表单个列的外观和行为。
  • 可以自定义页面模板和字段模板来控制网站的外观。
  • 重要提示:实体类中的部分方法,如OnChanging,可用于在插入和更新时获得更多控制。我们还没有研究这一点,但这是从动态数据网站的角度来看另一个重要的方面。

历史

  • 2012年5月2日:初版。
© . All rights reserved.