大约有将近一百万名开发人员使用了.NET Framework的第一个版本来开发网站。所以在2003年的夏天,当从Microsoft传出将有新版本发布的传闻时,许多人的耳朵都竖了起来,这个新的版本将使得创建ASP.NET页面所需的代码行数减少70%。像这样大规模的提高生产效率在程序设计中是不多见的。当ASP.NET 2.0的代码样例在2003年秋的Microsoft专业开发人员大会(Microsoft Professional Developer’s Conference)上演示时,结果比预计的还要好。以前使用ASP.NET的第一个版本程序员需要花费几个小时才能做出的页面,现在使用ASP.NET 2.0只需要几分钟就完成了。简单来说,在.NET Framework 2.0最终版本发布之后,任何继续使用第一个版本创建ASP.NET页面的程序人员都将花费大量的额外时间才能达到相同的结果。
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的鄂尔多斯网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
也许就像其他任何领域一样,ASP.NET开发提供的优势是能够方便地将数据集成进页面。程序员不再需要知道详细的连接、命令以及数据阅读器和数据适配器对象,就能执行普通数据任务了。对于初学者掌握能力,ASP.NET 2.0使得基本数据的使用简单易学,并且有能力进行更复杂的数据应用。
.NET Framework
Microsoft开发出了作为基本原理的.NET和一系列技术,用于在互联网中让计算机共同工作。总的目标就是让信息和进程在大范围的系统和设备之间顺畅地交流。.NET不是一种语言,也不是一个特别的产品。更确切地说,它是一套标准和规范,并已经应用于自2002年以来Microsoft发布的所有产品中。
.NET包含了一种使用开放标准的XML格式交换信息的标准化格式。可扩展标记语言(Extensible Markup Language,XML)不需要请求者具备任何有关数据存储如何保存信息的专门知识—— 数据都以自描述的XML格式取出。同样地,目前几乎所有的数据存储都可以用XML来提供信息,这对于所有.NET数据客户都具有吸引力。
.NET支持软件的Web Services标准,可请求在使用了开放平台标准的简单对象访问协议(Simple Object Access Protocol,SOAP)和XML的远程软件上运行代码。.NET网站可以从另外一个网站上找到该网站所提供的服务,并使用这些服务。这样可以使得网站从其他的网站上获得HTML、计算后的结果或者数据集。
作为.NET开端的一部分,Microsoft发布了一套运行时编程工具和应用编程接口(API),称为.NET Framework,让开发团队能够创建.NET应用程序和XML Web Services。.NET Framework由公共语言运行库(Common Language Runtime,CLR)和一套统一的类库组成。
CLR为运行的应用程序提供了一个完全管理的执行环境,其中包括几个服务,例如程序集装载和卸载、进程和内存的管理、安全实施以及即时编译等。CLR名称的意思就是指能够用多种语言编写应用程序,并且将源代码编译成CLR能够读懂并运行的中间语言,而无需考虑原来所使用的语言。这种“语言独立性”就是CLR的关键特性(也是ASP.NET的特性),它允许开发人员使用自己喜欢的语言工作,比如C#、VB或者Cobol,都能够获得.NET Framework的常用特性。
.NET Framework还包括了一套类库,这套类库提供了每一个应用程序所需的常用功能。可以使用.NET Framework支持的任何语言来访问这些类库。由这些类库提供的服务(以及相应的命名空间)如下:
· 基本类型(System)
· 输入/输出(System.IO)
· 数据访问(System.Data)
· 安全(System.Security)
· 数据结构(System.Collections)
· 配置(System.Configuration)
· 连网(System.Net)
· 反射(System.Reflection)
· 全球化(System.Globalization)
· 绘画和制图(System.Drawing)
· 跟踪和诊断(System.Diagnostics)
· 窗口(客户端)应用程序模型(System.Windows.Forms)
· Web应用程序模型(System.Web)
注意,.NET Framework包含了两个应用程序编程模型,一个用于客户端应用程序(System.Windows.Forms),另一个用于基于Web的应用程序(System.Web)。本书着重讲解后一个模型。.NET Framework中的System.Web命名空间是.NET Framework的一部分,它提供了ASP.NET功能。换句话说,ASP.NET就是构建应用程序的所有.NET Framework的一部分。
ASP.NET开发
ASP.NET是一种用于创建基于Web的应用程序的编程模型。从本质上来说,运行时和.NET Framework类库集可以用于创建动态Web页。它需要在Web服务器的环境中运行,例如Microsoft Internet Information Server(Microsoft互联网信息服务器,IIS),并且根据服务浏览器请求指示在服务器上执行程序。与直接由Web服务器提供的静态HTML不同的是,ASP.NET页面实际上是在服务器上执行以后再产生结果的。页面的最后生成也许是由许多不同的指令和/或数据源构造的。
ASP.NET页面以.aspx扩展名存储。页面由程序员将文本、标记(例如HTML)以及ASP.NET特定服务器标记和脚本组合在一起,然后存储在Web服务器上。可以将存储后的ASP.NET页面看成是一套描述如何创建一个HTML页面的指令。当该页面被请求浏览时,服务器端程序将会用纯标记来创建一个客户端浏览器可以读懂并能呈现(render)的页面。因为呈现后的输出是纯标记,所以任何浏览器都能够读懂;所有的动态过程都发生在Web服务器端。ASP.NET特定服务器标记非常强大,例如,它可以对用户的动作作出反应,连接至数据存储以及自动创建非常复杂的HTML结构。
正像前面提到的那样,ASP.NET只是.NET Framework的一部分,所以 ASP.NET页面可以利用这个框架提供的所有服务,包括连网、数据访问、安全以及更多其他服务。因为ASP.NET可以使用所有这些服务,所以相比以前,能够创建更加丰富的Web应用程序。只需花少量的时间来构建所有应用程序所需的构建块,而将大多数时间用在应用程序独有的特殊逻辑上。
ASP.NET开发还可以在Web编程中引入了一些独特的新技术,可以在典型的动态服务器页面(Active Server Pages,ASP)上极大地改善开发模式:
· 语言独立性——因为ASP.NET是.NET Framework的一部分,所以可以使用您自己选择的语言来构建ASP.NET应用程序,例如C#、VB或J#。而典型的ASP则仅限于JScript或者VBScript页面。
· 编译而不是解释——与典型的ASP在每一次页面请求时都解释编程结构不同,ASP.NET在服务器端动态地将页面编译成可以运行得非常快的本机编程指令。可以很明显地看到典型的ASP页面的性能与相同ASP.NET页面的性能之间相差的数量级别。
· 事件驱动编程模式——在典型的ASP中,页面总是以自顶向下的线性方式执行,并且HTML标记常常与程序指令混合在一起。任何一个有一定ASP经验的人都知道这样会使得页面难以阅读,甚至更加难以维护。ASP.NET引入了事件驱动模型,这个模型允许您将代码与标记内容分离,将代码并入处理专门任务的有意义的单元中,例如响应客户端的按钮单击动作。这个类似VB的事件模型极大地提高了页面的可读性和可维护性。
· 服务器控件——典型的ASP需要动态地将HTML片断代码接合在一起呈现,这样做的结果就是在应用程序中一遍又一遍地编写相同的代码(您需要多少次才能从数据库查询中构建一张表格)。ASP.NET带给Web编程的一个最大的好处就是能够将公共的呈现和行为封装成服务器控件(server control),可以在应用程序中很方便地重复使用。就像HTML标记一样,服务器控件以声明的形式创建,但是表现为一个位于服务器端的可编程对象,它可以与代码进行交互并输出定制的动态HTML呈现。ASP.NET包含了大约80多个服务器控件,这些控件封装了从标准表单元素到复杂控件(如网格和菜单)的所有内容。
· 控件设计时间的改善(当使用Visual Web Developer时)—— 开发人员通过使用设计时间界面可以减少花费在开发复杂页面上的时间,这些界面包括敏捷任务面板、标签级导航栏和可以设置控件属性的向导。
#p#
ASP.NET开发技术的第一个版本(1.0和1.1)在2001年至2003年间迅速风靡了Microsoft的开发阵营。程序人员很快便感觉到他们通过使用强大和灵活的.NET Framework可以大大减少编码时间,而且CIO们也看到当程序员花在解决客户代码的疑难问题上的时间减少时,他们就可以将更多的资源投入到更高级的IT结构的改善上。ASP.NET确实是一个里程碑式的版本,它简化了开发人员的工作。
但是,就在第一个版本发布之前,Microsoft的ASP.NET小组就已经在为开发ASP.NET 2.0而工作了。他们以下面雄心勃勃的目标来开始他们的工作:
· 使创建一个典型的Web应用程序所需代码行数减少70%。
· 提供一套可扩展的应用程序服务,用来为通用应用程序任务提供构建块,例如成员、角色、个人化以及导航等。
· 创建一系列基于任务的服务器控件,这些控件可以调节上述服务,交付完全、可定制的用户接口(UI),以最小的代码量来展示这些服务。
· 当与.NET Framework协同工作提供页面服务时,改善IIS的性能。
· 提供管理功能,以便加强ASP.NET服务器的部署、管理和运行。
· 改善宿主公司所用的工具,以便可以支持多站点并能够将开发人员的项目迁移至公共部署环境。
· 让ASP.NET的几乎所有特性都能够方便地扩展或者用定制的高级任务的执行替换。 在这里,我们有必要再来细细地回想一下第一个目标,也就是使编写一个动态Web应用程序所需的代码量减少70%。这有可能吗?Microsoft的ASP.NET小组已经仔细考虑过各种以定制代码执行的通用任务,并且专门制定了将这些任务封装进构建块(特别是服务器控件)的方式,这样就能够自动地完成这些任务了。例如,大多数Web应用程序都需要安全或者导航或者个性化服务来为用户提供定制的体验。在ASP.NET 2.0中,这些任务是通过一系列可配置的应用程序服务,以及与这些应用程序服务进行对话的服务器控件来实现的,这样可以极大地减少实施这些通用服务所需的应用程序的代码量。但是,在所有这些通用任务当中,有一个任务是绝对独立于其他应用程序的,这就是数据访问服务。数据是驱动所有动态Web应用程序的公用线程,所以毫不奇怪,ASP.NET小组为了减少代码量和在ASP.NET 2.0的应用程序中执行数据访问所需的概念,而制订了一些大胆的目标:
· 在ASP.NET开发中可以通过声明的(无代码)方式来定义一个数据源。
· 可以通过声明的(无代码)方式用UI控件显示数据,无需在页面的执行生存期中的特定时间进行显式的数据绑定。
· 可以通过声明的(无代码)方式执行通用数据任务,例如排序、分页、过滤、更新、插入以及删除数据。
· 可以使用多种UI控件来显示数据,包括灵活的网格/详细控件,该控件既可以显示又可以操作数据。
· 为创建定制的数据源,启用可扩展的模型来支持新的数据类型。
ASP.NET 2.0具有一些程序员可以使用的特定的服务器控件,用于在页面上添加数据交互。这些专门的数据控件分为两组:数据源控件和数据绑定控件。数据源控件创建与数据库的链接。数据绑定控件则从数据源控件获取信息,并在页面上创建呈现。这种简单的双控件模式可用于多种情况。对于多种数据库类型,甚至是非关系型数据源,都有相应的数据源控件。同样地,有多种数据绑定控件可用来在页面上生成表格、树型、列表以及其他数据格式。在前面我们已对ASP.NET进行了介绍,同时讲述了ASP.NET的一些理论,现在开始介绍本书剩余部分的细节内容:数据源控件和数据绑定控件的使用。数据源控件以及附带产品包括如下条目:
· SqlDataSource控件,用于与Microsoft SQL Server和其他数据库进行连接
· AccessDataSource控件,用于与MDB文件连接
· ObjectDataSource控件,用于与中间层对象连接
· XMLDataSource控件,用于XML文件或者数据流
· SiteMapDataSource控件,用于以ASP.NET 2.0站点地图格式存储的XML文件额外的控件已经由第三方开发。
在数据绑定控件中,有很多与ASP.NET 1.x中的相似,有一些则是ASP.NET 2.0全新开发的:
· ListBox、DropDownList和BulletedList、CheckBoxList、RadioButtonList
· AdRotator是实现旧功能的数据绑定控件
· DataList和Repeater以灵活的布局方式提供数据
· DataGrid(与ASP.NET 1.x中的相同)和GridView(第2个版本中的新控件)用于表格数据
· DetailsView和FormView以轻松的导航提供记录的信息
· TreeView用于显示分级数据
总之,数据源控件和数据绑定控件将会是本书重点介绍的对象。
在.NET Framework 2.0公开beta版本发布之前,少数的几个程序组就已经被允许查看工作代码,并希望尽快获得他们的反馈。结果,所有的反应只有一个,那就是热烈,“太好了!”然后就是“什么时候我才能用ASP.NET 2.0替换我的ASP.NET 1.x应用程序?”。现在beta发布版本已经在手边,我们无需再等待了。
ADO.NET
ADO.NET是.NET Framework中的一套类库,它将会让您更加方便地在应用程序中使用数据。Microsoft收集了过去几十年中最佳的数据连接的实践操作,并编写代码实现这些实践。这些代码被包装进了一些对象中,以便其他软件可以方便地使用。
ADO.NET中的代码处理了大量的数据库特有的复杂情况,所以当ASP.NET页面设计人员想读取或者写入数据时,他们只需编写少量的代码,并且这些代码都是标准化的。就像ASP.NET一样,ADO.NET不是一种语言。它是对象(类)的集合,在对象(类)中包含了由Microsoft编写的代码。可以使用诸如Visual Basic或者C#等编程语言来在对象外部运行这些代码。
可以将ADO.NET看作是一个介于数据源和数据使用者之间的非常灵巧的转换层。ADO.NET可以接受数据使用者语言中的命令,然后将这些命令转换成在数据源中可以正确执行任务的命令。但是,就像您将会看到的那样,ASP.NET 2.0提供了服务器端数据控件,可以更方便地与ADO.NET交互工作,所以有的时候这基本上减少了直接使用ADO.NET对象的需求。
#p#
很多读者已经有使用ASP.NET早期版本的经验了。这一小节将回顾一下这种模式,目的是演示您需要通过ADO.NET对象将数据引入Web页中的这一过程。对那些从来都没有使用过早期版本的读者来说,可以将本小节作为一个新奇的故事,类似于在发现乙醚之前进行的外科技术研究。在以前,创建一个简单典型的ASP.NET 1.x版本的页面需要如下代码:
- 〈script runat="server" 〉
- Sub Page_Load(ByVal sender As Object,
- ByVal e As System.EventArgs)
- BulletedList1.DataSource = GetAuthorsByState("CA")
- BulletedList1.DataBind()
- End Sub
- Shared Function GetAuthorsByState
- (ByVal state As String) As System.Data.DataSet
- Dim connectionString As String =
- "server=(local); database=pubs;
- trusted_connection=true"
- Dim dbConnection As System.Data.IDbConnection =
- New System.Data.SqlClient.
- SqlConnection(connectionString)
- Dim queryString As String =
- "SELECT [authors].[au_id], [authors].[au_fname],
- [authors].[au_lname], [authors].
- [state] FROM [authors] WHERE
- ([authors].[state] = @state)"
- Dim dbCommand As System.Data.IDbCommand =
- New System.Data.SqlClient.SqlCommand
- dbCommand.CommandText = queryString
- dbCommand.Connection = dbConnection
- Dim dbParam_state As System.Data.IDataParameter =
- New System.Data.SqlClient.SqlParameter
- dbParam_state.ParameterName = "@state"
- dbParam_state.Value = state
- dbParam_state.DbType = System.Data.DbType.
- StringFixedLength
- dbCommand.Parameters.Add(dbParam_state)
- Dim dataAdapter As System.Data.IDbDataAdapter =
- New System.Data.SqlClient.SqlDataAdapter
- dataAdapter.SelectCommand = dbCommand
- Dim dataSet As System.Data.DataSet =
- New System.Data.DataSet
- dataAdapter.Fill(dataSet)
- Return dataSet
- End Function
- 〈/script 〉
- 〈html 〉〈head runat="server" 〉
- 〈title 〉Untitled Page/title 〉〈/head 〉
- 〈body 〉
- 〈form id="form1" runat="server" 〉〈div 〉
- 〈asp:BulletedList ID="BulletedList1"
- DataTextField= "au_lname" Runat="server" / 〉
- 〈/div 〉〈/form 〉
- 〈/body 〉〈/html 〉
以上示例对数据库执行了一条简单的SQL SELECT语句,并将结果与一个BulletedList控件绑定。页面中有一个名为GetAuthorsByState的方法,该方法创建了用来完成这个任务的几个ADO.NET对象:
· SqlConnection对象表示与数据库服务器进行连接
· SqlCommand对象表示要执行的SQL SELECT命令
· SqlParameter对象代表了一个将被命令中的标记代替的值
· SqlDataAdapter表示填充命令中的DataSet对象的能力
· DataSet表示命令结果,可以与BulletedList进行绑定
在Page_Load事件中,调用GetAuthorsByState方法并生成DateSet结果,然后将这个结果赋给BulletedList的DataSource属性。接着,调用DataBind()使得BulletedList用这个数据结果将自己同步。我们在页面执行生存期中的适当的时候调用DataBind(),这样的做法是ASP.NET 2.0在一般情况下寻找并消除的一个关键步骤。实际上,在大多数情况下, ASP.NET 2.0根本不需要与ADO.NET进行交互操作。但是,理解上述ADO.NET对象之间的关系是非常有用的,这样我们就可以讨论 ASP.NET 2.0是如何改进这个模式的。
ASP.NET 2.0和数据访问
ASP.NET 2.0给我们提供了一个改良的数据访问模式,这个模式减少了在 ASP.NET 1.x中执行数据绑定所需的代码量。首先,无需编程实现实例化、设置属性以及调用前述列表中的ADO对象的方法。您需要做的就是在页面上简单地添加服务器端控件并设置属性。当呈现页面时,ASP.NET 2.0将会自动地执行所有的对象实例化,并调用方法创建并显示数据。请将以下ASP.NET 2.0代码与上面的代码进行对比:
- 〈html 〉
- 〈head runat="server" 〉
- 〈title 〉Demo〈/title 〉〈/head 〉
- 〈body 〉
- 〈form id="form1" runat="server" 〉
- 〈asp:SqlDataSource ID="SqlDataSource1"
- Runat="server" SelectCommand="SELECT
- au_lname FROM authors WHERE (state = @state)"
- ConnectionString="Server=HPSERV;
- Integrated Security=True;Database=pubs" 〉
- 〈SelectParameters 〉
- 〈asp:Parameter Type="String"
- DefaultValue="CA" Name="state" / 〉
- 〈/SelectParameters 〉
- 〈/asp:SqlDataSource 〉
- 〈asp:BulletedList ID="BulletedList1"
- runat="server" DataSourceID="SqlDataSource1"
- DataTextField="Au_lname" 〉
- 〈/asp:BulletedList 〉
- 〈/form 〉
- 〈/body 〉〈/html 〉
#p#
第二个改进来自于对在页面生存期中的事件敏感的服务器端控件。ASP.NET 2.0 服务器端控件能够在正确的时间做出正确的动作。请注意在ASP.NET 2.0页面中对页面生存期中的事件的任何引用。ASP早期版本的学生一般都会对在页面生存期中执行多种任务感到迷惑,特别是数据绑定。因此,很多ASP.NET 1.x页面都会有这样的让程序员编写代码的遭遇,即在错误的事件下调用DataBind,或者在多个事件中多次调用DataBind。这些定时操作现在都可以通过ASP.NET 2.0的服务器端数据控件来自动完成。
请注意在前面的ASP.NET 2.0的代码中使用了两个服务器端控件。第一个是数据源控件,本例中是SqlDataSource控件。该控件在后台建立了所有显示数据所需的ADO连接对象,包括Connection、Command以及DataReader或者Dataset对象。然后,使用了一个名为BulletedList的数据绑定控件,用来获取数据源控件的数据,并在页面上呈现。
术语
在完成介绍性内容之前,我将提供一个到目前为止所用到的术语表。
· 动态Web页—— 作为代码存储在Web服务器上的文件,当被请求时,可转换为HTML。当页面被转换时,他们可以根据用户和网站拥有者的实时情况而按照不同的请求来获取不同的表单。
· IIS—— 在Windows中内置的Web服务器,用于通过TCP/IP向请求者提供Web页。运行于Windows 2000或者Windows XP Professional上的IIS可以使用.NET Framework类来提供ASP.NET Web页。
· .NET Framework—— 一组包含Microsoft编写的代码的类,可以使得开发应用程序更加方便和快捷,并且更易于在互联网上运行。很多类都已经被封装进能够启用.NET 的大约十多个Microsoft产品当中了。 sflj www.it55.com kg^&fgd
· CLR(公共语言运行库)—— .NET Framework的一项特性,可以让编程人员用多种语言编写代码,然后将代码编译成可用来部署的单独、统一的语言。
· ASP.NET—— .NET Framework中的运行时和类库集,用来创建动态Web应用程序。
· 数据存储—— 数据被存放和管理的地方。所有的RDBMS都可用于数据存储,但是有些数据存储就不是RDBMS,因为它们不是关系型的。
· 数据库或关系型数据库管理系统(RDMS)—— 一种可以读取和操纵数据的软件。大多数系统包含了用来设计和测试数据库的工具,以及优化过程的工具。一个RDBMS必须按照标准化形式(关系型格式)存储数据。
· DataBase模式(或数据库元数据)—— 数据库结构,包括表和关系的设计。该模式不包括实际的数据值。
· MicrosoftTM Access—— 一种基于MDB文件格式、JET引擎以及一系列用于创建和使用数据库的工具的RDMS。Access价格便宜,容易学习,能被广泛接受并且已经被部署到很多机器上。但是,它不支持太多的并发用户。
· JET—— 运行在后台并使用MDB(Access)文件的数据库引擎。JET可以直接从其他软件(例如.NET或Access)接受命令来读取或者修改MDB文件。
· 结构化查询语言(Structured Query Language,SQL)—— 一种被数据使用者用来从数据提供程序那里请求读取或者写入数据的语言。经过近十年的发展,SQL已经成为与RDBMS通信的标准。
· MicrosoftTM SQL Server—— 一种企业级的RDBMS,可以支持大量的数据和大量的并发用户。
· MicrosoftTM SQL Server Express(SSE)—— 基于Microsoft SQL Server数据库引擎的可免费获得的数据库引擎。与SQL Server不同的是,SSE能提供的同时数据连接数量有限,并且只有少数几个功能。本书将在大多数示例中使用SSE。
· MicrosoftTM Data Engine(MSDE)—— 与SSE类似,但是基于SQL Server引擎的早期版本。MSDE将在本书的练习中使用。
· XML—— 一种标准的数据格式,每个值都被存储并描述。XML不是非常有效率(用于描述的空间通常会超过数据的大小),但是却能被很多不同的数据管理系统方便地读取。
· Web页编辑器—— 一种允许打开和修改页面的软件。最常用的编辑器是记事本。Visual Studio、Visual Web Developer和ASP.NET Web Matrix与其他工具打包成一个编辑器,用以提高效率。 · 集成开发环境(Integrated Development Environment,IDE)—— 一套用来帮助编程人员开发代码的工具。Visual Studio就是一个非常强大的IDE;Web ASP.NET Web Matrix也提供了很多工具。典型的IDE应当包含一个Web页编辑器。
· ADO.NET—— 由Microsoft编写的类(代码)的集合,作为数据存储(例如Access或者XML文件)和数据使用者(例如ASP页面)之间的中间件。
· 连接—— 一个ADO对象,表示数据使用者和数据提供程序之间的惟一路径。
· 命令—— 一个ADO对象,表示一条可以被传递给数据库的SQL语句。
· 参数—— 一个ADO对象,表示在语句进入数据库之前可以被插入Common Object(SQL语句)中的多个数据。
· DataSet—— 一个ADO对象,表示集成至记录或字段中的一组数据。
· 服务器控件—— 一组独立的代码(一个对象),用于在服务器上执行任务,生成兼容HTML的并且发送至浏览器的页面。通过ViewState,服务器端控件可以维持其状态。
· 数据源控件—— 一种服务器端控件,可以创建专门的、惟一的数据库连接。它提供了ADO对象的一种抽象并且使得编写ASP.NET 2.0页面更加快速和容易。数据源控件可用于Microsoft SQL Server、Access、XML以及其他数据源。
· 数据绑定控件—— 一种服务器端控件,可以从数据源控件中获得数据并在页面上呈现它。数据绑定控件将程序员从编写诸如〈 table 〉的HTML标记中解脱出来。数据绑定控件可用于呈现表格、列表、树型以及其他结构。
文章标题:ASP.NET开发相关技术简介
标题网址:http://www.gawzjz.com/qtweb2/news7/19557.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联