利用 ASP.NET Starter Kit 即刻开始 Web 站点开发
发布日期: 12/31/2004 | 更新日期: 12/31/2004
本文假设您熟悉 Web 开发
下载本文的代码: StarterKits.exe (141KB)
摘要
如果您要构建 ASP.NET Web 站点,则需要在坚固可靠的代码基础上来开始构建。从一个完整的站点开始,进行一些修改和自定义,然后上线,是不是很棒?ASP.NET Starter Kit 就是一种允许您这样做的打包解决方案。这五个工具包(Community、Reports、Commerce、Portal 和 Time Tracker)提供可重复使用且可易于自定义的完整代码。此外,有许多 ISP 支持对 ASP.NET Starter Kit Web 站点进行自动部署,当您必须快速进行部署时,留给您的任务会只有很少的一部分。作者在本文中介绍了 ASP.NET Starter Kit,并构建了一个具有许多高级功能(如评价、用户投票、上载配额、更改通知和主题)的社区 Web 站点。
本页内容
Commerce Starter Kit 和 Portal Starter Kit
ASP.NET 和 Visual Studio® .NET 的确已经使 Web 应用程序开发更为简单。但是,在创建 ASP.NET Web 站点时,仍需要您亲自完成一些工作。您仍需要设计一个完善的应用程序,用可重复使用的可靠代码开发它,并对其进行彻底测试。在该过程中,您可能会问自己:“是不是有人早已解决了该问题?我是不是在重复开发?”一些情形对于大多数 ASP.NET 开发人员而言是共同的,如组合社区站点,跟踪某个项目的时间或者为公司创建门户。基于一个具有完善设计的基础来进行构建(而不必从头设计应用程序,即使这意味着可以自定义和扩展解决方案),会带来不错的结果。这正是 ASP.NET Starter Kit 的设计思想。
ASP.NET Starter Kit 是 Microsoft 提供的一组(共五个)打包示例应用程序,您可从 http://www.asp.net/starterkits 下载。其中包括一个电子商务店面应用程序、一个社区 Web 站点、一个门户站点、示例报表和一个项目时间跟踪应用程序。Starter Kit 的目的在于,提供几个有用的起始 Web 站点和一些可靠的 ASP.NET 代码示例,您可以从中进行学习并在此基础上构建站点。所有这五个 Starter Kit 都附带了完整的源代码,可将 SQL Server? 或 Microsoft? 数据引擎 (MSDE) 用作数据存储并且可在 Visual Basic?、C# 和 J# 版本中使用。此外,Starter Kit 既可以在 Visual Studio .NET 版本(带有独立的 .aspx 和代码隐藏页)中使用,也可以在 SDK 版本(没有代码隐藏页)中使用。因此,您可以在自己喜欢的环境中使用 Starter Kit,而无论该环境是 Visual Studio .NET、ASP.NET Web Matrix Project 还是某个其他编辑器。在本文中,我将介绍这五个 ASP.NET Starter Kit。然后,将重点介绍 Community Starter Kit,以便向您展示如何根据您的具体需要来扩展它。
Commerce Starter Kit 和 Portal Starter Kit
Commerce Starter Kit 要为虚构的间谍公司 IBuySpy 创建电子商务店面应用程序。该应用程序使用了一个三层体系结构、缓存功能、窗体身份验证和一个购物车。Commerce Starter Kit 还包括一个 B2B Web 服务组件。这是一个可供您研究和学习的绝佳应用程序,尤其是当您需要构建自己的电子商务应用程序时。
Portal Starter Kit 为 Commerce Starter Kit 中描述的虚构间谍公司 IBuySpy 创建门户应用程序。Portal Starter Kit 包括 10 个门户模块:通知、联系人、讨论、事件、html/text、图像、链接、快速链接、xml/xsl 和一个自定义模块。
Time Tracker Starter Kit
Time Tracker Starter Kit(请参阅图 1)实质上是一个没有记帐组件的时间和记帐 Intranet 应用程序。它相当简单。它有三个选项卡:Log、Reports 和 Administration。Administration 选项卡可用来配置项目,Log 选项卡可用来记录小时数,Reports 选项卡可用来按项目或个人生成报表。
图 1 Time Tracker Starter Kit 中的 Log 选项卡
Time Tracker Starter Kit 显示了许多有趣的 ASP.NET 体系结构方面的功能,如三层设计、Windows? 和窗体身份验证、使用 GDI+ 生成动态图表以及移动前端。
Reports Starter Kit
Reports Starter Kit 与其他 Starter Kit 的区别在于,它不是一个单一的聚合应用程序。更正确地讲,它是一系列(共八个)报表,您可以读取这些报表,针对示例数据运行它们并检查其源代码。此外,您可以复制这些源代码并将它们粘贴到自己的应用程序中。该工具包的工作方式类似于随 Microsoft .NET Framework SDK 和 Visual Studio .NET 提供的 ASP.NET QuickStart。这些报表示例包括简单的表格报表、两种样式的分层深入报表、交叉表和几个 GDI+ 图表。
Community Starter Kit
Community Starter Kit 可能会是核心工具包。使用它,无需花费太多精力或者无需知道它的工作原理,就可为用户组、俱乐部、家庭或社区快速组合社区站点。还可以使用它来组合简单的新闻和信息站点。在某些方面,它与 Portal Starter Kit 提供的功能相重叠,但是它更侧重于非商业组织并且更易于设置和管理。
Community Starter Kit 支持许多不同类型的内容,包括文章、照片库和事件列表。此外,它还支持大量可选功能(这些功能在许多社区站点上为标准功能),其中包括广告、仲裁、上载配额、评价、评论、用户投票、内容更改通知、自动转换、主题、Web 箱、联合、新闻稿、外观和安全性。
广告由两个 AdRotator 控件来处理,一个控件具有标准大小(468×60 像素)的横幅,另一个具有 125×125 像素的横幅。如果您针对某个区域启用仲裁功能,那么,这一区域的内容必须得到审阅人的许可才能显示在该站点上。您可以为每个用户都设置上载配额,以便限制可上载到站点上的图像和文件的数量。Community Starter Kit 还支持整个社区的上载配额。这允许 ISP 在单一箱子中宿主许多社区,而不会让一个站点占用可用的所有磁盘空间。
您可以选择针对特定类型的内容(如图书或文章)打开用户评价和评论功能。用户可以对内容项进行评价(评级可以从 1 到 5),如果愿意的话,他们也可以输入评论来代替评级,或者既添加评级又添加评论。
Community Starter Kit 支持对用户投票进行创建和报告。因此,您可以用诸如“您喜欢哪种面向 .NET 的开发语言?”或者“齐柏林飞船合唱团最初的鼓手叫什么?”之类的问题来对用户进行民意测验。还可以在某个区域中有新内容时自动通知用户。甚至可以指定转换功能,以便将污秽语言自动从提交内容和评论中清除,而无需您进行任何干预。
Community Starter Kit 有一个选项允许您创建主题列表,以便要求用户在添加投稿内容时对该内容进行分类。因此,基于 .NET Framework 的新闻站点的主题可以是 ASP.NET、托管 C++、Web 服务等。
Community Starter Kit 允许您通过启用各种 Web 箱来在页面空白处添加需要突出显示的内容。例如,您可以使用 Web 箱在主页上显示最流行或最新的文章、链接、下载或照片。还可以使用引用 Web 箱来在页面上显示随机引用。
Community Starter Kit 支持通过两种机制来复制内容:服务订阅和 Web 服务箱。使用服务订阅机制,可以聚合另一个 Community Starter Kit 站点区域的内容并将其显示在您的站点上。例如,您可以订阅另一个社区站点的讨论区域,并将其显示在自己的站点上,就好像它们是您自己的讨论区域一样。与 Web 箱一样,Web 服务箱在页面空白处显示摘录信息;但是,Web 服务箱可以从其他站点获得其内容。您可以订阅另一个将其内容作为 XML Web 服务来发布的 Community Starter Kit 站点,也可以订阅 RSS 服务,如 http://msdn.microsoft.com/msdnmag/rss/recent.xml。您可以利用 XML Web 服务和 SOAP 协议(而不是目前的 RSS 协议),将站点的任何区域作为社区服务来发布。所发布的区域可以用作服务订阅或 Web 服务箱。
您可以向社区成员发送新闻稿。新闻稿组件既支持模板,也支持嵌入特殊标记,您可以使用这些标记来包括诸如 Username、FullName 和 Password 之类的字段,以及诸如 NewArticles、NewBooks 和 NewDownloads 之类的内容特定的字段。
Community Starter Kit 引擎支持外观或主题等概念,并允许您通过从管理页上选择另一个主题来完全改变站点的外观。外观和主题将在本文稍后讨论。
Community Starter Kit 支持广泛的安全系统,这些系统将成员按照其角色进行分类:匿名、已身份验证、审阅人和管理员,也可以按照您自定义的角色来进行分类。您还可以保护站点任何区域的安全,以便只有特定类型的用户可以查看、添加、编辑或删除内容。
图 2 社区Web 站点示例
图 2 举例说明了 Community Starter Kit 支持的许多社区功能。该社区是一个名为 Ballard .NET 的虚构用户组,它使用 Professional 主题。请注意,用户投票显示在页面的顶部,社区服务供给箱标题“.NET Tips & Tricks”位于页面的右下角。
创建社区
在下载和安装 Community Starter Kit 之后,您希望做的第一件事情会是删除示例站点数据。这可以通过单击导航条底部的“Login”链接并以 Admin 用户身份用 Admin 密码登录来完成。(由于该密码会造成安全风险,因此请尽快更改该密码。)在成功登录之后,新链接 (Admin) 将出现在导航条上。单击该链接跳转到站点的管理部分,向下滚动,查找“Delete Content”链接。
当删除内容之后返回到社区主页时,您会注意到一些示例内容仍保留着。要将主页内容替换为自己的内容,需要返回到管理页,单击“Edit Sections”,单击“Home”区域,并提供一个站点标题、说明和徽标。还可以使用这个“Edit Sections”选项来更改主页的基本布局、选择主题或者启用主页的许多可选功能(如显示 Web 箱或 Web 服务箱)。
在设置了主页的布局以后,可以向站点中添加多个区域。一个站点可以有无限多个区域。图 3 列出了可创建的各种类型的区域(或模块)。
要添加一个区域,请从管理页单击“Edit Sections”链接。您可以创建多个类型相同的区域。例如,图 2 中显示的社区站点包括两个文章区域:News 和 Articles。可以使用父区域来帮助组织一组类似的区域。例如,如果您希望按一般分类来分离下载内容,则可以创建一个包含几个下载区域(如 User Contributions、Controls 和 Speaker Presentations)的父区域。
从“Edit Sections”页,可以启用适用于特定区域的各种可选功能,如仲裁或电子邮件通知。还可以选择将该区域的内容作为社区 Web 服务来发布。
Community Starter Kit 结构
尽管许多 Web 站点都是受数据驱动且动态生成的,但是其中大多数在很大程度上仍是静态的。尽管这不一定是坏事,但是站点上动态生成的内容越多,它的自定义程度越高。Community Starter Kit 完全是数据驱动的。如果不计算用于站点管理的页面,Community Starter Kit 仅包含一个没有内容的 .aspx 页。所有内容都存储在 SQL Server 或 MSDE 数据库中。Community Starter Kit 的单个安装支持多个可使用特殊 ISPAdmin 帐户配置的社区。
当向 Web 服务器请求 Community Starter Kit 页面时,一个名为 CommunitiesModule 的 HTTPModule 会处理该请求,确定与该请求相关联的社区、区域、页面和用户,并分别填充 CommunityInfo、SectionInfo、PageInfo 和 UserInfo 对象。这些对象是 Context 对象的 Items 集合中的成员。因为 Context 对象可以在参与一个请求的所有模块和处理程序中保存,所以,这些数据将对于处理该请求的页面可用(有关 Context 对象的更多详细信息,请参阅 Steven Smith 撰写的“ASP.NET:Nine Options for Managing Persistent User State in Your ASP.NET Application”,该文刊登在 2003 年 4 月号的 MSDN? Magazine 中)。然后 CommunitiesModule 将该请求重定向到 communityDefault.aspx 页,该页负责使用上述对象、许多用户控件、支持类和样式表动态生成响应。
现成的 Community Starter Kit 可能无法完成您希望的一切,但是该工具包在设计时考虑了扩展性。如果您不喜欢它的工作方式,则可以轻松地更改它。毕竟,它附带有以 Visual Basic .NET、C# 和 J# 编写的完整源代码。该工具包的主题和模块元素特别适合进行自定义。
使用主题
Community Starter Kit 是基于 ASP.NET Forums 应用程序设计的,与 Forums 应用程序一样,它也使用主题(又称作外观)来将用户界面与代码分开。主题远不只是样式表。实际上,没有主题,就会没有内容,这是由于主题包含所有显示在站点上的控件。主题由图 4 中列出的元素组成。
要新建主题,需要在 Communities\Common\Themes 文件夹下面添加一个文件夹。主题的名称派生自该文件夹的名称。在该文件夹下面,创建图 4中显示的文件夹。幸运的是,由于所有的主题都从基本主题 Default 继承,所以您不必填充主题的所有文件夹。因此,如果您不提供主题所需的外观,Community Starter Kit 会使用 Default 主题的外观。
尽管 Default 主题包含 75 个以上的文件,您仍可以通过只提供几个文件来创建基本主题。我创建了一个名为 Small 的基本主题,它是 Default 主题的精简版本。它与 Default 主题的基本区别在于,其采用更小的字体,颜色由蓝色改为红色,默认页部分采用不同的布局。我的新主题由下列六个文件组成:
•
Communities\Common\Themes\Small\Images\ redshiny3dsquarebullet_7x7.jpg
•
Communities\Common\Themes\Small\Skins\ControlSkins\ Sections_SectionMenu.ascx
•
Communities\Common\Themes\Small\Skins\PageSkins\Default.ascx
•
Communities\Common\Themes\Small\Styles\an_red_arrow.gif
•
Communities\Common\Themes\Small\Styles\Default.css
•
Communities\Common\Themes\Small\Styles\redyellowstar.gif
当然,提供的元素越多,主题将越完整。例如,如果您深入到使用 Small 主题的某个区域,仍将看到具有蓝色背景的控件。但是,如果我没有更改过该主题的配色方案,这就是最明智的做法了。要新建一个主题,最简单的方法就是以现有的主题作为模型,然后修改其外观和样式。
创建新模块
尽管这比创建主题有点复杂,但是您还可以为社区创建新模块。例如,我创建了一个名为 Jobs 的模块,用它来跟踪工作公告。
要新建模块,首先向 CommunityStarterKit 数据库中添加一个用来跟踪新模块项的新表,并将该表命名为 Community_module(其中,module 是新模块的名称)。该表的主键应当命名为 module_ContentPageID,连同要针对该模块收集的其他字段的名称。
您将需要可用于添加新模块项的存储过程,编辑现有项目,检索项目列表,然后检索单个项目的所有字段。将 Jobs 模块的存储过程命名为 Community_JobsAddJob、Community_JobsEditJob、Community_JobsGetJobs 和 Community_JobsGetJob。我复制了 Articles 模块的存储过程,将它们用作 Jobs 存储过程的模型,并添加跟踪工作公告所必需的其他字段。Community_JobsGetJobs 用于检索 Jobs_Section 页中的工作列表。该模块调用 Community_GetPagedSortedContent 函数以对输出内容进行分页(请参阅图 5)。
在 Engine\Modules 下创建一个将包含该模块代码的新文件夹。在该文件夹下,应当有三个名为 Components、Content 和 Controls 的子文件夹。对于 Jobs 模块,我创建了 Engine\Modules\Jobs\Components、Engine\Modules\Jobs\Content 和 Engine\Modules\Jobs\Controls folders。Components 文件夹应当包含两个类库,第一个类库包含从 ContentInfo 类派生的类,第二个类库包含负责调用每个模块的存储过程的实用工具类。
使用 Visual Basic .NET 版本的 Community Starter Kit,我创建了一个名为 JobInfo.vb 的类库,其中包含一个单一类 (JobInfo)。我将 ArticleInfo.vb 类库用作我的类库的模型。JobInfo 构造函数使用单一参数 DataReader,通过该参数从 Jobs 表抽取每个字段,并将它们放入随后将作为 JobInfo 类的一系列属性公开的私有变量中(请参阅图 6 中的代码)。
JobUtility 类提供 Jobs 模块和 Jobs 存储过程之间的接口,其中包含单一类 JobUtility,该类有四种方法:AddJob、EditJob、GetJobs 和 GetJobInfo。GetJobs 方法负责调用 Community_JobsGetJobs 存储过程并返回 JobInfo 对象的 ArrayList(请参阅图 7)。
对于该模块支持的每个基本类型的页面,Content 文件夹都应当包含一个类库。这些类将成为以后创建的用户控件的代码。至少,您的模块需要为下面每种类型的页面提供类:添加项目、编辑项目、显示项目列表(对于区域页)和显示单个项目(对于项目深化页)。这些类需要分别从 ContentAddPage、ContentEditPage、ContentListPage 或 ContentItemPage 派生。正如您可能已经注意到的那样,Content 往往与它们所调用的存储过程具有一对一对应关系。
我创建了四个类库(AddJob.vb、EditJob.vb、JobSection.vb 和 Job.vb),每个类库都以 Articles 内容类库为模型。内容类用来粘附 JobInfo 类和用户控件外观。Job.vb 类库中的 Job 类负责显示特定工作列表的完整信息(请参见图 8)。
对于显示在 Job 和 JobSection 页上的每个工作项,Controls 文件夹将包含自定义的服务器控件。我为 Job 页创建了下列服务器控件:JobCompany、JobTempStatus、JobTempMonths、JobStartDate、JobLocation、JobEducation、JobExperience、JobSalary、JobContactName、JobContactPhone、JobContactEmail、JobContactWeb 和 JobEditContent。对于 JobSection 页,我创建了 ItemJobLocation 控件。JobCompany 自定义控件显示在图 9 中。
现在,您需要创建一些用户控件,来表示与在上一步中创建的 SkinnedCommunityControl 类相对应的每个基本模块页的内容外观。至少,您必须为 Default 主题提供一组内容外观用户控件。还可以为其他主题提供内容外观用户控件。
我在 Themes\Default\Skins\ContentSkins 文件夹下创建了三个用户控件:Jobs_AddJob.ascx、Jobs_JobSection.ascx 和 Jobs_Job.ascx。没有用来编辑工作的用户控件,这是因为 Jobs_AddJob.ascx 控件执行双重任务,它为添加工作和编辑工作均提供支持。图 10 中显示了 Jobs_Job.ascx 用户控件的摘录。请注意对 Engine\Modules\Jobs\Controls 文件夹中名为 JobCompany 和 JobTempStatus 的自定义服务器控件的引用。
此时,我向新内容控件的默认样式表 (Themes\theme\ Styles\default.css) 添加了样式。图 11 显示了其中的几个新样式。
最后,我向数据库中的 Community_PageTypes 和 Community_NamedPages 表添加了用于该项目以及项目区域页的条目。借助于模仿现有 Community_MaintenanceInitializeArticles 存储过程创建的名为 Community_ MaintenanceInitializeJobs 的存储过程,该步骤要相对简单。运行该存储过程会创建必要的表格条目。
图 12 JobSection 页面
图 12 显示了 Ballard .NET 社区站点的 JobSection 页。如果您单击工作公告下面的“Read More”链接,将显示如图 13 所示的 Job 页。
图 13 Job 页
从本文开头的链接地址下载构成 Jobs 模块(以及 Small 主题)的文件副本。
小结
ASP.NET Starter Kit 提供几个预包装的示例应用程序,这些应用程序既提供可正常工作的 Web 站点模板,又提供用 Visual Basic .NET、C# 和 J# 编写的易用的示例代码。这些工具包代表最常见的 Web 应用程序,包括社区、商务、门户、报表和项目时间跟踪站点。本文讨论了 Starter Kit 的安装和使用,以及通过代码(即使您没有 Visual Studio .NET 副本)自定义和扩展 Community Starter Kit 的方法。如果您在寻求一种即刻开始创建 ASP.NET 站点的方法,这些工具包可能是您要寻找的一组便捷工具。还需注意的是,个别的提供 Web 托管的公司可提供对 Starter Kit 的自动部署以及帐户注册。有关详细信息,请参阅 http://www.asp.net/hosters。
感谢 Stephen Walther 帮助我撰写本文。
有关背景信息,请参阅:
http://msdn.microsoft.com/aspnet
Paul Litwin 是 Deep Training 的 CEO 兼高级培训师,该公司主要从事 .NET 培训。他是 Microsoft ASP.NET Connections 的会议主席,他亲自撰写或与人合著有多本书籍,其中包括 ASP.NET for Developers (SAMS, 2001)。他目前正在撰写一本有关 ASP.NET 的新书。您可以通过 paull@deeptraining.com 与 Paul 联系。