ASP.NET Starter Kit包括5个示例应用程序,告诉Web开发人员如何利用ASP.NET 1.x的功能。Starter Kit包括一些重要功能的参考实现,如交互式HTML报表、更换皮肤和主题、身份验证和授权、移动Web浏览器支持等等。花费1小时研究Starter Kit的源代码,可以省下大量编程与调试的时间。
在ASP.NET 2.0中,Microsoft引入了大量的改进和新功能,可以极大地提高开发人员的生产率,大幅度减少Web开发人员要编写的代码行数。ASP.NET 2.0的一些功能实际上将Starter Kit中尝试的几个关键功能变成了实现。本文介绍了ASP.NET 2.0中的一些最卓越的新功能,并把使用ASP.NET 2.0功能的简单性和Starter Kit完成类似功能所需要的大量代码加以对比。
Starter Kit大阅兵
社区
Community Starter Kit实现了一个面向社区的Web站点,它用模板、主题、皮肤,以及来自SQL Server数据库的动态数据组合形成网页。Community Starter Kit中基于模板的方法十分强大。宿主在Starter Kit同一实例中的多个社区可具有各自独特的外观。不幸的是,Community Starter Kit的模板方法为站点添加了一层复杂性,可能很难把握,尤其是对那些尚处于ASP.NET学习曲线上升阶段的开发人员而言。
在ASP.NET 2.0中,主控页面和主题提供了简单得多的方法,保证站点中的所有页面具有一致的外观。主控页面还提供了一些有趣的功能,仅仅依靠Community Starter Kit建立站点是无法实现的,比如嵌套主控页面的能力。
门户
Portal Starter Kit实现了一个基本的Web门户,同时提供桌面和移动浏览器界面。对于桌面用户,门户呈现一个选项卡用户界面。每个选项卡包含许多“模块”,而每个模块则显示内容。例如,一个模块类型是Events模块,它显示一列来自数据库的将要发生的事件。对于移动用户,通过一组移动Web表单来公开更为有限的界面。
Portal Starter Kit使用Form身份验证和自定义的基于角色的授权解决方案,为不同类型的用户呈现不同的选项卡。最值得一提的是Admin选项卡,只能供Administrator角色中的用户使用。
在ASP.NET 2.0中,新的Membership、Role Management和Login UI功能将用户管理所需要的代码减少到微不足道,而提供的功能却比为v1.0/v1.1 Portal Starter Kit编写的全部代码都多。ASP.NET 2.0新增的移动设备支持使移动用户可以访问门户,而不需要一套专门为移动用户建立的Web表单。
报表
Report Starter Kit为一些常见报表类型(总表-明细、表格和条形图)提供了示例实现。Report Starter Kit提供的不仅仅是静态报表:报表是交互式的,具有分类和向下挖掘等功能。尽管Report Starter Kit有效地利用了声明性标记和数据绑定,但为了使报表能够工作依然需要一些管线代码。
使用ASP.NET 2.0中新的数据控件和数据绑定功能,可以生成类似于Report Starter Kit的HTML报表,但比ASP.NET 1.x需要的代码要少。数据源和数据绑定可以用ASP.NET标记声明性地表示。ASP.NET 2.0负责所有的管线,无需编写一行Visual Basic或C#代码,就能生成带有分类、分页和双向数据绑定功能的交互式Web表单。
商务
Commerce Starter Kit是IBuySpy公司的Web商店。主要功能包括商品分类目录、购物车、用户注册和身份验证以及Web服务接口。Commerce Starter Kit使用公用的“标题和脚注用户控件”保持整个站点一致的外观。标题用户控件实际上包含页标题的内容和左侧导航菜单,左侧导航菜单包含动态生成的产品类别列表。
使用ASP.NET 2.0,实现Commerce Starter Kit需要的代码少得多,而且可以用更可管理的方式控制每个页面使其具有一致的外观和布局。新的Membership、Role Management、Login UI、Master Pages和Themes都可用来提供与Commerce Starter Kit同样的功能,但代码总行数大大减少了。
时间跟踪和项目管理
Time Tracker Starter Kit是一组业务应用程序,提供了基本的时间跟踪和项目管理功能。Time Tracker使用了ASP.NET的多种核心功能,包括身份验证、数据绑定和移动Web界面。
使用ASP.NET 2.0,通过Master Pages、Membership、Role Management、Login UI控件和零代码数据绑定,可以大大缩减时间跟踪应用程序所需的代码,其代码量只有Time Tracker Starter Kit的一个零头。另外,所有ASP.NET 2.0中的控件都是设备感知的,因此同一个ASPX页面可以同时支持桌面和移动浏览器。
ASP.NET 2.0的新增功能
Microsoft在ASP.NET 2.0中引入了令人难以置信的大量新特性和新功能,远远超出了一篇文章的范围。事实上,Microsoft ASP.NET Developer Center关于ASP.NET 2.0的新功能有一系列的文章。其中一些与讨论ASP.NET Starter Kit关系很密切,因为如果用ASP.NET 2.0的新功能构建同样的解决方案,Starter Kit中的大量参考代码都不再需要了。
如果将ASP.NET 2.0的目的归纳为一句话,那就是:“提高开发人员的生产率,并极大地减少开发人员必须编写的代码行数。”这一节可以看到,许多常见任务只需要几行代码就能完成,甚至根本不需要代码。当然,声明性标记和XML配置依然需要编写,但使用Microsoft Visual Studio 2005中的新增Visual Web Designer和ASP.NET配置工具,可以轻松地创建绝大多数正确的标记和XML配置设置。
本文的其余部分将介绍ASP.NET 2.0新增的一些功能,并将ASP.NET 2.0的功能和Starter Kit参考应用程序提供的实现加以比较。
通过安全控件和成员实现更好的身份验证
大多数开发人员在某个时候都需要为其Web应用程序提供身份验证和授权方案。有时访问管理功能就像单个登录一样简单,但在另外一些时候,整个Web应用程序按照匿名用户还是经过身份验证的用户来决定为他们提供不同的功能,经过身份验证的用户根据其各自的角色获得对不同功能组的访问权。5个ASP.NET Starter Kit中有4个需要身份验证才能访问特定的功能。例如,Commerce Starter Kit只允许经过身份验证的用户下订单。
尽管ASP.NET 1.x提供了一个公共身份验证框架和多种身份验证类型,但对开发人员而言依然是一个巨大的开发负担,尤其在使用表单身份验证的时候。添加身份验证到ASP.NET 1.x Web站点需要定义数据仓库,比如SQL Server数据库,并创建完成以下任务所需的所有功能:创建用户,编辑用户配置文件,重新设置密码、验证凭据并将用户与安全角色相关联。
ASP.NET 2.0引入了新的Membership功能,包括一个简单易学的API和一些基于Web的工具,用于配置与管理成员。ASP.NET 2.0提供了了Web开发人员所期待的全部功能,包括对SQL Server数据仓库的成熟且完善的支持;以加密形式存储的口令密码;用户统计;用于创建、删除和更新用户的API;密码恢复和重新设置功能。
。要启动Web应用程序的Membership,只要选择Website | ASP.NET Configuration菜单命令,并遵循提示操作即可。安全安装向导将指导您完成初始设置,包括创建一个成员数据库。
一旦Membership数据库建立就绪,创建新用户只需一行代码:
Membership.CreateUser(username, password, emailAddress)
要验证用户的凭据,需要另一行代码:
Membership.ValidateUser(username, password)
在ASP.NET 1.x中,接下来需要为用户界面创建几个控件以收集凭据,然后编写一个调用FormsAuthentication.RedirectFromLoginPage的事件处理程序。在ASP.NET 2.0中,此过程通过引入了一个新的Login控件而得到了简化。
<asp:DataGrid id="DataGrid1" runat="server" />
onauthenticate="Login1_Authenticate"/>
Login控件的OnAuthenticate事件的事件处理程序只需少量代码即可实际验证用户的身份。
Sub Login1_Authenticate(ByVal s As Object, _
ByVal e As AuthenticateEventArgs)
If Membership.ValidateUser(Login1.UserName, _
Login1.Password) Then
e.Authenticated = True
End If
End Sub
Login控件还考虑到了一些细节问题,比如强制一个非空的用户名或密码(以客户端验证代码结束)和一个“Remember me next time”复选框,从而创建一个稳定的身份验证票据。
与ASP.NET 2.0中设置身份验证的简单性相比,Commerce Starter Kit则需要相当多的声明性标记来创建一个以数据验证结束的等价用户界面。
此外,Commerce Starter Kit还需要一个加密用户密码的自定义实现,一个验证用户凭据的自定义实现,以及一个响应登录尝试失败的自定义实现。以下代码段摘自Commerce Starter Kit,调用的Login和Encrypt方法均在Commerce Starter Kit中进行定义,它们大约需要25行代码,在ASP.NET 2.0中您不必担心它们。通过使用Login控件,您无需再编写代码来重定向到登录页面或显示“Login Failed”消息。
Dim smsc As ScalarMiningStructureColumn = _
accountSystem.Login(email.Text, _
ASPNET.StarterKit.Commerce.Security.Encrypt(password.Text))
If customerId <> "" Then
...
' Redirect browser back to originating page
FormsAuthentication.RedirectFromLoginPage(customerId, _
RememberLogin.Checked)
Else
Message.Text = "Login Failed!"
End If
Commerce Starter Kit中全部代码所提供的功能,在ASP.NET 2.0中,只需在Login1_Authenticate中使用一行标记(<asp:Login>)和三行代码即可完成。ASP.NET 2.0还免费提供Commerce Starter Kit不包括的附加功能,比如可用于自助密码检索/重新设置的控件。
通过主控页面获得更好的模板/皮肤
所有ASP.NET Starter Kit都使用几个公共方法中之一来维护各个页面的一致外观。例如,Commerce Starter Kit使用特定标题用户控件的输出作为每个页面的开始内容。这种方法需要标题用户控件显式地注册并添加到每个ASPX页面中。
<%@ Register TagPrefix="ASPNETCommerce"
TagName="Header" Src="_Header.ascx" %>
...
<asp:DataGrid id="DataGrid1" runat="server" />
该技术与“标题和脚注”方法密切相关,它使用来自一对用户控件的输出来包装页面内容。尽管这两个方法在ASP.NET程序员中非常受欢迎,但在使用中受到一些局限性的束缚:
· 一个服务器控件标记(即<td runat="server">)不能跨多文件。如果标记在标题用户控件中打开,则它必须还在标题用户控件中关闭。
· HTML标记能够跨多个文件,因此您能够在标题中打开一个<td>标记并在一个脚注中关闭它,但Visual Studio .NET 2003在Design和HTML Source视图之间切换时,将自动在用户控件中创建关闭标记如果您使用Visual Studio .NET 2003中的可视设计器,则维护标题和脚注用户控件会变得十分困难。
· 修改站点的图形设计和布局对于Web或图形设计人员来说既麻烦又困难,而且为开发人员增加额外的工作负担。
Community Starter Kit使用一种完全不同的方法。Community Starter Kit定义一个“页面皮肤”充当每个页面的模板。页面皮肤实际上是一个用户控件,它包含一个用于页面内容的占位符。一个通用Web格式:communityDefault.aspx装载页面外观(使用Page.LoadControl),然后将相应的目录装载到页面外观的目录占位符中。该方法在概念上类似于ASP.NET 2.0中的主控页面,但不够健壮,而且不大容易使用。
' Load the Page Skin
objPageSkin = LoadControl((CommunityGlobals.AppPath + _
"/Communities/" + _
objSectionInfo.Skin + "/Skins/PageSkins/Default.ascx"))
' Add the Page Content Page Part
objPagePart = CType(objPageSkin.FindControl("content"), _
PlaceHolder)
If existingModel Is Nothing Then
Dim smsc As ScalarMiningStructureColumn = _
CType(Activator.CreateInstance( _
Type.GetType(objPageInfo.Content, _
True)), Control)
objPagePart.Controls.Add(objPageContent)
End If
以下是必须包括在页面皮肤(/Skins/PageSkins/Default.ascx)中内容控件,这样FindControl方法能够找到可以在其中添加内容的地方。
<asp:DataGrid id="DataGrid1" runat="server" />
使用ASP.NET中的页面模板还有一些其他选项。要了解更多的例子,请参考本文后面其他参考资料一节中列出的DevX一文。
在ASP.NET的1.0/1.1版本中,页面模板和皮肤解决方案未能广泛使用,原因是这些流行选项产生的模板对于图形设计人员来说很难使用,开发人员缺乏设计时体验,并且会产生微不足道的瑕疵导致站点瘫痪的风险。
ASP.NET 2.0中的主控页面完全改变了Web开发人员的前景。主控页面易于使用,可以提供足以令人羡慕的设计体验,而且提供比1.0/1.1站点中使用的公共模板方法更多的功能。使用主控页面需要两步:创建主控页面(即模板),然后创建内容页面(即引用主控页面的Web表单)。
创建并编辑主控页面就像创建Web表单,二者只有很少的差别。主控页面的扩展名是.master而不是.aspx。而且,主控页面带有@Master指令而非@Page指令。Visual Studio 2005考虑到了这些细节,因此在IDE中编辑主控页面与编辑Web表单具有相同的设计时体验。
主控页面可以包含服务器控件和其他标记,以及服务器端代码(比如Button控件的单击事件处理程序)。在想要插入特定于页面的内容的标记中的位置,只需添加一个ContentPlaceHolder控件。
<asp:DataGrid id="DataGrid1" runat="server" />
内容页面只是一个在其@Page指令中引用了主控页面的Web表单。
<%@ Page Language="C#" %>
masterpagefile="~/MasterPage.master" title="Home" %>
通过将Content控件添加到内容页面,可以为主控页面中的每个ContentPlaceHolder提供内容。
<asp:Content ID="Content1"
ContentPlaceHolderID="ContentPlaceHolder1" Runat="server">
This is content for the content placeholder in the master.
</asp:Repeater>
Visual Studio 2005中一个最激动人心的功能就是新增的Visual Web Developer能够在设计时显示内容页面。主控页面中定义的模板显示在可视设计器中,但是出现重影,以便与页面内容区分开。连同诸如用户控件的设计时呈现等其他功能,Visual Studio 2005提供了丰富的可视化反馈功能,从而使我们不必在Web浏览器中打开页面就能看到页面外观。
在上面的例子中,还无法表明主控页面能够容纳多个ContentPlaceHolder控件。可以为主控页面中的每个ContentPlaceHolder提供默认的内容,只有当默认的内容不合适时,单个内容页面才必须提供内容。
最后一个功能是主控页面自身能够引用另一个主控页面,从而提供了强大的层叠模型。Visual Studio 2005的预测试版本没有提供嵌套主控页面的可视设计支持。这一支持可能在最终版本中加入。
通过主题获得更好的样式/主题控件
Community Starter Kit为社区选定主题提供了自定义实现,这将影响给定社区的模板及其内容的显示。在Community Starter Kit中,一个主题实际上就是一个.css文件(层叠样式表)。
在ASP.NET 2.0中,主题提供了一种定义页面外观的机制,它具有一些像Community Starter Kit的简单样式表实现中所不具备的其他功能。
在ASP.NET 2.0中,主题是一个文件夹,包括.skin、.css和图像文件。要在Web站点中添加一个主题,需要在项目中添加一个主题文件夹,然后使用主题的名称在\Themes下添加一个文件夹(比如\Themes\VeryBlue)。在主题的文件夹中,可以添加任意多的皮肤和样式表文件,以定义任意服务器控件或HTML元素的外观。
要使用页面的主题,只需简单地将Theme属性添加到@Page指令。您可以让Visual Studio 2005为您添加此属性,方法是通过属性窗口编辑页面的Theme属性。(属性窗口提供一个只包含实际存在的主题的下拉列表)。
使用VeryBlue主题的用户在生成的HTML输出中呈现相应的样式值。使用Microsoft Internet Explorer的View Source功能,可以检查ASP.NET 2.0站点生成的输出。为主题文件夹中的每个.css文件生成一个<link>元素。
<link rel="stylesheet" href="Themes/VeryBlue/StyleSheet.css"
type="text/css" />
主题文件夹中所有皮肤文件的设置均用于提供服务器控件属性的值,然后这些值被转换为相应的HTML输出。r对于TextBox控件,Text属性变为生成的<input>标记的值,而BackColor和ForeColor属性用于生成样式属性。
<input name="_ctl0$ContentPlaceHolder1$Textbox1" type="text"
value="<default>" id="_ctl0$ContentPlaceHolder1$Textbox1"
style="color:Navy;background-color:LightBlue;" />
主题文件夹中的所有皮肤(.skin文件)和样式表(.css文件)都是自动应用的。可以随意使用或多或少的.skin和.css文件来定义主题。
利用更好的数据控件进行更好的报表编制
Report Starter Kit使用嵌套数据绑定控件来创建一些交互式数据报表。尽管Report Starter Kit声明性地完成其大部分工作(即使用ASP.NET标记),还需要一些管线代码来将它们链接起来。使用ASP.NET 2.0的新增数据控件,类似报表可以完全在标记中定义,无需显式的管线代码。ASP.NET 2.0允许使用新增的DataSource控件和用于浏览和编辑数据的数据绑定控件来创建这些“零代码Web页”。
数据源控件
ASP.NET 2.0中新增的DataSource控件提供一种声明性语法,用于定义数据源(比如SQL Server数据库)并控制数据的检索和更新。从概念上来讲,DataSource控件可以看作是一个连接对象和选择/更新/插入/删除命令的包装器,尽管DataSource控件可用于诸如XML文档和业务对象之类的非数据库数据源。
下面的标记显示如何使用SqlDataSource控件来检索Reports数据库中的全部产品。注意连接字符串使用一种新的声明性语法来获得,该语法自动从Web.config的<connectionStrings>部分读取连接字符串。
<asp:SqlDataSource ID="SqlDataSource3"
Runat="server"
SelectCommand="SELECT [Reports_Products].* FROM [Reports_Products]"
ConnectionString="<%$ ConnectionStrings:Contoso %>"
</asp:Repeater>
只带一个SelectCommand的SqlDataSource控件适用于单向数据绑定。对于双向数据绑定,DataSource控件需要关于如何插入、更新和删除数据仓库中数据的其他信息。
ASP.NET 2.0中的DataSource控件的卓越之处在于它能够指定数据源。要显示从这些数据源检索的数据,需要使用这些绑定到DataSource控件的控件,比如新增的GridView控件。
GridView
ASP.NET 2.0中新增的GridView控件取代了DataGrid控件,从而成为显示与编辑网格中数据的首要数据控件。尽管DataGrid极其强大,而且在ASP.NET 2.0中依然被支持,DataGrid不能像GridView控件那样支持双向“零代码”数据绑定。
使用上面定义的ProductsDataSource,我们可以轻松地将GridView配置为支持双向“零代码”数据绑定。
<asp:GridView ID="GridView1"
Runat="server"
DataSourceID="ProductsDataSource"
AutoGenerateEditButton="True"
AllowSorting="True">
</asp:Repeater>
对于简单的更新操作,您需要做的只是将GridView的AutoGenerateEditButton设置为 |