版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、asp.net 2.0编程珠玑ch 02 asp.net 2.0编程珠玑 高清版 第 章 2 开头新项目 无论是迁移已有的 1.1应用程序,还是从头开头一个全新的 2.0应用程序,都最好先制定一个策略,确定如何开头。本章就探讨一些可以在开头新项目时使用的不同技术,关心用户制定策略。这个策略应在全部的项目中贯彻始终,并随着时间的推移进行一些演化,以执行最佳实践方式。在项目中始终贯彻一个策略,不仅便于在各个项目之间迁移,还有助于培训团队中的新人。本章将介绍一些在开头新项目时可以作为最佳实践使用的技术。 在建立新应用程序时,需要考虑解决方案的组织方式。例如,把全部的代码放在一个网站上,且不预备在以后
2、与其他项目共享,就不是一个好的选择。考虑与其他项目共享代码或定制控件,就比开头一个新项目更好。假如已建立了在每个项目中都要使用的公共服务器控件或有用例程,则只要设置必要的引用,就可以使用它们。 本章要争论的一个概念是在每个web窗体上使用baseuipage类,而不是让web窗体继承system.web.ui.page,这是在项目中添加新web窗体时的默认配置。这需要修改每个web窗体,所以,从一开头就使用baseuipage类,比以后在项目中采纳它更划算。假如读者对使用基类进行继承比较生疏,不必担忧。本章的后面将介绍如何使用基类。master page是另一个重要的例子,由于它会影响每个we
3、b窗体,但不需要预先考虑它。假如以后打算使用master page,只需修改已有的页面,利用新的master page模型即可。 第11章将具体争论从1.x迁移到2.0的过程,本章是第11章的补充。在迁移过程中,我们可能要执行本章所争论的一些转变。例如,在迁移过程中,要采纳master page,或把一些公共代码提取到一个类库中,进行更广泛的重用。在阅读本章时,读者应考虑其中的技术是否能在自己的迁移过程中采纳。 本章争论的很多概念最好在开头新项目时实现。在项目生存期的后期实现这里描述的技术并不是不行能,但假如这些技术不是从一开头就实现,其效果一般不是很好。这里争论的很多技术还可以打包,通过vi
4、sual studio 2021中的导出模板功能在建立站点时使用。采纳最佳实践方式,一个页面接一个页面地重用模板,将省去很多重复工作。本章描述了如何在建立项目的过程中应用模板,第13章会更具体地争论模板的概念。 假定本章的全部建议和争论在全部的项目中都有意义是不切实际的。与本书的大多数主题一样,不需要完全接受这里的建议,只需采纳适合于自己公司的技术,开发需要的应用程序即可。 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 2.1 组织项目和解决方案 在开头开发新的应用程序时,首先要做的一个决策是如何组织项目。对于小型应用程序而言,只建立一个 web文件夹是可以的,有时也很简洁,但通常最
5、好有一个多项目的结构。假如应用程序将来会包含几个网站,共享一个数据库结构,或要供应windows窗体、windows服务,或其他共享某些公共项目的非web应用程序类型,就肯定要建立多项目结构。 例如,在项目之间共享的最常见的形式是公司多年来开发的、不专用于一个应用程序的有用代码。假如要把这样的代码放在自己的web项目中,并没有一种简洁的方式从其他的web应用程序中引用它们。而只能复制执行代码,最终,一个版本的几个副本会略有区分。以后假如发觉一个错误,该错误将只在一个副本中修改,当产品消失问题时,就必需有三四个问题处理方案,而不是只有一个。 当然,假如web项目中已经有有用代码或公共代码,完全可
6、以把它们移动到一个公共的类库中。但是,这会导致更多的工作,由于必需修改当前的应用程序,以引用新库。在 2.0中,某些特定的应用程序命名空间在默认状况下并不使用,所以,必需在使用该有用代码或公共代码的每个类中添加命名空间引用。假如一开头采纳了多项目结构,并打算在应用程序之间共享代码,就可以避开这个额外的工作。 组织应用程序中的项目并没有什么正确的方式,这里提出的方法并不是一个适用于全部状况的解决方案,但可以给读者指明正确的方向。除非所建立的应用程序特别小,否则,首先创建一个空白的解决方案是最好的方式。 解决方案允许加载多个项目,使用solution explorer可以在这些项目中导航。除了作为
7、多个项目的容器之外,在一个项目中引用同一个解决方案的另一个项目时,引用信息会存储在解决方案文件中。 全部的项目都有一个解决方案文件,但有时它是不行见的。在和visual web developer项目设置中,用户必需选择file | add | new project,添加其次个项目,解决方案才会显示在solution explorer中。在visual c#设置中,解决方案总是显示在solution explorer中。无论把网站保存在什么地方,visual studio都会在default projects location名目下创建一个解决方案文件。在和visual c#中,选择tool
8、s | options | environment | general可以设置这个位置。visual web developer没有修改这个名目的属性。但是,进入my documents | visual studio 2021 | settings,选择currentsettings.vssettings,就可以修改这个位置。在这个文件中,假如找到字符串name=projectsandsolution,再在xml配置文件中找到如下元素,就找到了需要修改的字符串。修改该字符串,使之指向自己选择的位置。 propertyvalue name=projectslocation%vsspv_visu
9、alstudio_dir%projects/propertyvalue 下面的xpath表达式可以在xml配置文件中找到该位置: /usersettings/toolsoptions/toolsoptionscategoryname=environment/tool soptionssubcategoryname=projectsandsolution/propertyvalue name=projectslocation 26 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 2.1.1 创建解决方案 创建解决方案有三种基本方式: 如上所述,可以创建一个新的网站,在default
10、project locations名目下就会自动创 建一个解决方案。依据设置的不同,在有多个激活的项目之前,可能在solution explorer中看得到或看不到该解决方案。 在创建像类库这样的项目时,假如打开了一个已有的项目,就可以把这个新项目 添加到已有的解决方案中,或创建一个新的解决方案。假如选择add to existing,就不会创建新的解决方案,项目只是添加到当前激活的解决方案中。否则,就必需确定是否要为解决方案创建一个新名目。假如没有选择create a new directory,解决方案的名称就与我们添加的项目相同,且放在同一个名目下。对于包含多个项目的解决方案而言,这不是
11、一个抱负的设置。 假如选择创建新名目,就应输入新名目的名称,该名称也是解决方案文件的名称。向导执行完后,就在输入位置指定的路径下创建解决方案的名目,在该名目下创建项目。例如,假如项目的名称是common,路径是c:,解决方案是mysolution,就会得到如下名目结构: c:mysolution c:mysolutionmysolution.sln c:mysolutioncommon c:mysolutioncommoncommon.csproj 采纳这个方法,只要创建了新名目,就可以在创建公共项目的同时创建解决方案文件,将两步合并为一步。 创建解决方案的最终一种常见方法是选择file |
12、new project。然后,在new project wizard中,扩展other project types选项,找到blank solution项,如图2-1所示。 图 2-1 27 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 留意: 假如使用了source safe,包含在解决方案中的全部项目都必需绑定到同一个source safe数据库上,否则就会产生一个错误,visual studio 2021将只从一个数据库中加载项目。假如由于项目位于不同的位置,而使加载失败,就应使用本章后面争论的bin文件引用技术。 2.1.2 创建web项目 在visual studio 20
13、21中,创建项目的方式有了变化。不再选择file | new | project,接着选择 web application wizard;而是只选择file | new web site,这会自动运行向导。向导供应了三个选项:file、ftp和http。http项目需要iis,类似于以前使用 v1.1的状况。在开发过程中,我们经常使用基于文件的方法,再使用iis进行部署。 ftp选项可以在服务器上保存文件,通过ftp访问它们。这是共享环境的一种可能配置,在共享环境下,很多人可以同时使用项目。另外,还可以使用ftp设置远程编辑文件,其中,远程服务器iis有一个虚拟名目映射到ftp文件驻留的位置。
14、ftp选项的最大缺陷是,不能使用源控件,团队中的多个人可能对项目进行相互冲突的改动。 文件项目基于开发人员所使用的物理名目。在该名目及其子名目中创建或复制的任何文件或文件夹都是项目的一部分。 假如使用file选项,从visual studio中启动网站,就要使用visual studio附带的内置web服务器。但这样就不再有项目文件。web项目由该web项目标识的文件夹中的文件组成。不再需要iis,也不会在默认状况下创建新的iis虚拟应用程序。 还要留意,不会创建web.config或global.asax文件。虽然这取决于我们选择的模板,但 2.0的目标是创建尽可能少的额外文件,并允许在需要
15、时添加它们。例如,第一次运行调试器或执行其他操作时,如使用web administration应用程序,web.config文件会自动创建。global.asax文件不会创建,除非明确添加它。 2.1.3 从web文件夹中删除文件 在 2.0中没有项目文件的一个副作用是,损失了删除文件的功能。为了解决这个问题,小组在每个web文件夹项的弹出菜单中增加了exclude from project or include in project菜单项,从而加入了从visual studio中删除文件的功能。 从web文件夹中删除一项时,visual studio会重新命名这一项,加上.exclude后缀
16、,如表2-1所示: 28 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 虽然该项从web文件夹的建立过程中删除,但并没有从源代码掌握供应程序管理的项目中删除。在删除源代码掌握的项目时,需要指定是否把文件的新名称反映到源代码掌握库中。 2.1.4 小组的一个窍门程序 本节也可以称为“最新的项目消息”,由于笔者在完成最终的书稿校对时,小组在几个月的辛勤工作后,公布了一个插件,它可以为web应用程序创建新的项目模型。创建新模型的缘由是回应visual studio 2021发布的无项目模型上的早期反馈。在发布的版本中引入新模型的最大问题与建立新应用程序并不相关,而与迁移已有的visua
17、l studio 2021网站相关。我们主要关注的是新编译模型会生成多个程序集。在迁移不需要这种孤立级别的应用程序时,需要的工作量比预期的大。 将发布的新项目模型并没有替代visual studio 2021中的模型,它是一个附加的选项。新模型的运转方式特别类似于visual studio 2021中人们已经习惯的方式: 在每次编译过程中,全部的代码都编译到bin文件夹的一个程序集中。 全部的文件都在一个项目文件中定义,假如它们只存在于文件夹中,就不编译。 visual studio 2021附带的新web项目模型要求类文件只能放在app_code文件夹 中,而这个模型可以把独立的类文件放在任
18、何地方。 该模型使用标准的msbuild编译,还可以使用标准的msbuild扩展功能扩展它。 它的编译模型与visual studio 2021模型更接近,所以这个模型的转换和使用对已有应用程序的修改要求更少。对于新应用程序,可以依据工作流和开发风格来打算。 这类项目经常用于支持web公共用户控件和master page在项目之间的共享。这是由于单个程序集编译模型特别适合于使用标准的visual studio引用功能进行简洁的引用。 在出版本书的过程中,这个选项只存在于小组组长scott guthrie的预展版本中。在站点上可以找到这个预展版本的更多信息。 2.1.5 创建公共类库项目 一个比
19、较重要的决策是:把全部的代码都放在网站上,还是把公共代码放在一个独立的类库中。完全可以把独立的类、有用的类、定制服务器控件和数据类都放在网站的app_code文件夹下。 把全部代码都放在一个web项目中,以后当有另一个项目需要引用这些代码时,问题就来了。此时,有两个选择:可以复制代码,这样代码就重复了;还可以把这些代码移到一个公共类库中,更新已有应用程序中对它的全部引用。假如打算复制代码,则在一个项目中对这些代码的修改不会反映在其他项目中。可以把代码移到一个共享库中,但不能设置很好的命名空间层次,所以必需修改很多代码,才能使用这个新的共享副本。 比较好的方法是事先确定哪些代码要在项目之间共享,
20、再创建一个公共库,其中放置 29 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 尽可能多的代码。这个新的公共库不仅可以由当前应用程序引用,还可以由将来的应用程序引用。 为了在解决方案中添加新的类库,应确保在solution explorer中选择solution level,再选择file | add | new project。假如这是在网站的外部添加到解决方案中的第一个项目,solution explorer会把项目显示为解决方案的分支。 依据要创建的这些类库的数量,策略会有所不同,这大多取决于项目和开发团队的规模。共享的代码类型也可以影响策略。例如,假如要共享数据库代码,并使用
21、两个不同的数据库供应商,则可以把这些代码放在两个不同的库中,通过一个供应程序模型来引用。有关供应程序的更多信息请参见第3章。 在创建库时,还应考虑依靠性,但肯定要避开循环引用。例如,创建下面的库就特别糟糕: 库a依靠库b 库b依靠库c 库c依靠库a 这不仅创建起来很简单,而且,即使在建立过程中没有错误,它也并不是一个强壮的体系结构。这里不深化争论体系结构,阻挡发生这种状况的一种较简洁的方式是使用“层”的概念,如图2-2所示。在层的概念中,全部的引用都是向下的,这表示库永久都不能引用其上面的层中的项。 应用程序子系统1 应用程序公共代码 应用程序数据库访问 有用例程 应用程序子系统2 图 2-2
22、 下面更详细地解释这个例子:“有用例程”中的类永久都不会访问其上面的层中的代码。而“应用程序公共代码”中的类可以访问“应用程序数据库访问”和“有用例程”库中的类。 可以在解决方案中创建任意数量的类库。例如,本书将创建一个名为common的类库。留意,创建太多的类库会增加它们的管理成本,所以应找出最合适的类库数量。使用类库中的文件夹经常就足够了,不需要其他库。 留意: 解决方案中的全部项目不肯定要用同一种语言编写。在visual studio 2021中,现在可以在同一个项目中混用不同的语言文件。 30 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 2.1.6 选择命名空间 我们要
23、考虑用于项目的命名空间。一种方法是为web应用程序选择像company name.applicationname这样的命名空间,例如wiley.mvphacks。还可以给可重用的库指定类似的命名空间,但要确保它是比较一般的,而不是包含某个应用程序名。例如,假如库是用于完成会计任务的,就可以命名为wiley.accounting。 另一种常见的方法是扩展命名空间,使项目中的每个文件夹都将其名称添加到项目级的命名空间中。这将增加文件夹结构的直观性,有助于引用其他项目中的类。 项目文件包含默认的命名空间设置。web项目没有项目文件,所以不能设置默认命名空间。但是,假如在解决方案中添加一个类库,就可以
24、为该类库设置默认命名空间。详细方法是:在solution explorer中选择class library项目节点的properties,再选择application,最终设置default namespace字段。 在类库上设置命名空间时,还要考虑给程序集指定的名称。把项目命名为common是有意义的,由于其代码在应用程序中是公共的,但这会把程序集命名为common.dll。比较好的方法是使程序集的名称匹配项目的根命名空间。例如,mon会使程序集命名为mon.dll,降低了自己所选名称与第三方或组织中其他项目冲突的可能性。 如前所述,在visual studio 2021中新建网站时,默认为
25、不指定命名空间。假如转换一个已有的站点,全部已有的页面将保留其以前使用的命名空间,而新添加的页面在默认状况下不会添加命名空间。当然,可以给文件手动添加一个命名空间。另外,假如选择使用app_code存储一些类,并可能把它们移到一个单独的类库中,最好把某种形式的命名空间放在这些类上。以后在进行这类决策时,就不必做大量的修改了。 2.1.7 使用数据库项目 数据库项目用于保存sql脚本、查询和存储过程。数据库项目经常是visual studio中开发人员不太知道的一个特性,除非有人告知他们。不要混淆数据库项目与sql server项目(详见本章下一节),数据库项目用于保存sql脚本,而sql se
26、rver项目用于保存在microsoft sql server上运行的clr托管代码。 假如当前没有使用数据库项目保存脚本和存储过程,就将它们保存在文件中,再将它们应用于sql server。假如这么做很危急,可以只把最初的副本保存在sql server中。 为保存存储过程和其他sql脚本而使用数据库项目,一个很显著的优点是项目可以包含在visual studio解决方案中。这样,就很简单在主项目文件和数据库项目之间切换,来 31 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 访问存储过程了。另外,在搜寻时,项目很简单包含在搜寻结果中。最终一个优点是,可以集成visual studi
27、o支持的源代码掌握,在存储过程和sql脚本上进行版本掌握。 很简单在本章前面创建的解决方案中添加一个数据库项目。使用file | new project,扩展other project types部分。然后选择database类别。这样database project模板就会显示在模板列表中,如图2-3所示。 图 2-3 假如使用默认模板,在建立项目时就会创建几个初始文件夹。这些文件夹特别基本,其名称是queries、create scripts等。这些都是初始名称,不需要使用它们。实际上,使用对应用程序有意义的名称,会使项目更有用,更便于维护。 在使用存储过程时,一种方法是把存储过程放在与数
28、据库域对象相关的文件夹中。例如,假如有几个与地址相关的存储过程,就可以创建一个address文件夹,把这些存储过程存放在该文件夹中。肯定要留意,项目供应了一个文件夹层次结构,可用于给脚本分类,一旦脚本运行起来,应用于数据库,这种分类特性就会丢失。在开发过程中,无论存储过程是否位于有意义的文件夹层次结构中,sql server都没有文件夹的概念,所以给sql server添加了内容后,都只会看到一个大大的列表。 刚才争论的是把什么代码放在哪个文件夹中,另一个要考虑的重要问题是:是否有非存储的过程脚本也存放在项目中,例如,创建/删除表的脚本或刷新表中数据的脚本。假如打算把它们也存储在数据库项目中,
29、而且将它们存放在存储过程所在的文件夹下,它们就有可能在不正确的时间运行。这是以前在晚上测试备份的一个绝妙方式。这是如何发生的?数据库项目的一个特性是,它可以选择文件夹中的一项,单击“run”或“run on”,在目标数据库上运行脚本。假如把删除/创建脚本混入文件夹,而不知情的团队成员选择全部的项,在数据库上运行它们时,会认为自己只是把存储过程添加到数据库中。他们在发觉备份时32 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 会特别惊异! 1. 添加数据库引用 把数据库项目添加到解决方案中时,向导会启动add database reference对话框,如图2-4所示,提示选择一个
30、数据库引用。在数据库项目的一项上执行操作时,要使用这个引用。使用数据库项目不要求必需有引用,所以可以取消这个对话框,现在不选择引用。该引用可以在将来的任何时刻添加或删除。也可以有多个引用,在数据库项目的一项上执行操作时选择一个激活的引用。 图 2-4 假如添加一个新引用,就要供应一些信息,例如服务器名。另外,还要选择验证类型,是否要存储用户和密码。假如可能,在团队环境下工作时,windows验证供应了一种互不干扰的方式。假如选择使用用户和密码,但不允许存储它们,则每次打开项目时,都要供应用户和密码。 2. 添加已有的脚本 右击一个文件夹,选择add existing,就可以把已有的脚本添加到数
31、据库项目上。假如脚本位于另一个位置,就把它们的副本放在目标文件夹中。 假如已有的脚本不在文件中,就可以利用sql server管理工具的generate script功能。确保选择把每个对象放在单独文件中的选项。假如全部的对象都在一个文件中生成,数据库项目供应的很多优势就会丢失。肯定要把文件生成为windows文本,而不是ansi,否则,脚本中就会有乱码。 2.1.8 使用sql server项目 microsoft sql server 2021中新增的一个特性是可以使用托管代码创建数据库对象,如存储过程、用户定义的函数和用户定义的类型。在托管代码中实现的数据库对象需要添加到sql serv
32、er项目中。我们可能只把在sql server中运行的类放在托管代码中,作为本章前面推举的一个应用程序类库的一部分。而sql server项目有特别的引用和特性,使该项 33 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 目成为放置这类代码的唯一位置。 完整论述托管数据库对象的创建超出了本书的范围,这里提及它,是由于这类项目可能会应用于我们正在建立的应用程序。在托管代码中编写的数据库对象可以供应许多优势,访问较简单的语言功能,但它们也不适合全部的应用程序,不是全部的应用程序都需要它们。在使用它们之前,应认真考虑数据访问的类型和应用程序进行的处理。 只转换运行一个简洁查询的transa
33、ct-sql (t-sql)存储过程,并不适合使用托管的数据库对象功能。相反,对结果中的每一行都要进行大量数学函数计算,或限定结果集时,使用它们比较好。使用托管的数据库对象将允许利用特别丰富的语言语法,在很多状况下,与使用t-sql开发的相同数据库对象相比,代码更简单维护。 与部署transact-sql数据库对象相比,部署托管代码数据库对象会增加应用程序的简单性。假如在应用程序中使用用户定义的类型,并在查询中返回它们,要特殊留意版本策略和到数据库服务器的部署,并调用应用程序安装程序,以确保版本兼容。 2.1.9 使用web安装和部署项目 第12章将解释网站部署的各个选项。在安装过程中,要考虑
34、创建一个web安装项目或web部署项目。在早期建立部署模型,就可以事先考虑最佳实践方式,而不是等到要部署时再考虑。 2.2 创建项目引用 建立了解决方案,添加了最初的项目后,就要创建引用了,以便web项目可以查看和利用公共库中的类。假如在公司范围内添加了多个库或使用第三方的库,现在也应建立这些引用。 表2-2描述了可以建立的4类引用: 34 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 使用solution explorer中的references树型节点添加和查看引用。这个功能移动到web项目的property pages上。图2-5显示了添加到property pages上的
35、新页面,它允许查看和修改引用。要进入property pages,可以在solution explorer中右击网站,选择properties。 图 2-5 一个可能混淆的地方是,为什么像system.web这样的程序集不需要手动引用,而其他system.*程序集需要。默认状况下,在位于框架安装名目下的系统web.config文件中,下面是默认添加为引用的部分程序集: compilation defaultlanguage=c# debug=true assemblies add assembly=system.data.oracleclient, version=, cultu
36、re=neutral, publickeytoken=b77a5c561934e089/ add assembly=system.design, version=, culture=neutral, publickeytoken=b03f5f7f11d50a3a/ /assemblies /compilation 考虑一下类库在部署过程中如何使用。假如它们仅在一个应用程序中部署,通常应把它们用作私有程序集。在共享状况或不能掌握部署机器的其他环境下,必需把类库部署为 35 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 公共程序集。 假如类库部署到有很多应用程序使用它的机器
37、上,就可以使用全局程序集缓存 (gac)。这个方法会注册程序集和程序集的特定版本,这样应用程序就可以引用一个公共的版本。其优点是,全部的应用程序都引用相同的版本;假如更新该版本(且版本号不变),全部的应用程序就会同时全部更新。然而,这种方法的缺陷经常超过其削减重复所带来的效益。例如,在生产过程中,我们经常要快速修补一个应用程序,而不是修补使用该模块的全部应用程序。使用gac将不具备这个功能,除非拥有版本掌握力量,可以创建一个新的不同版本,只让指定的应用程序修补引用。在为其他应用程序和将来的部署引用该程序集时,这个版本问题会提高简单性。假如选择使用gac,程序集就必需有一个强名,在gac中注册时
38、使用它。所以必需认真考虑,确保gac适合于放置共享程序集。 2.3 使用源代码掌握 对项目使用某种形式的源代码掌握有几个优点,最大的优点是可以使团队更好地工作。使用源代码掌握的人经常会说,他们很多次地查看文件的历史,找出谁或何时进行了修改,而这个修改导致了错误。这还供应了一种好方法,可以使用贴标签的方式或类似的功能重新创建特定的版本,确保在将来的某一刻获得组成某个版本的全部文件。 在完成新项目的建立后,通常就应考虑使用源代码掌握了。在建立了全部的初始项目后,就应使解决方案和相关的项目处于源代码掌握之下。 有几个源代码掌握供应程序供我们选择,本书不准备介绍全部这些供应程序。过去,最常见的供应程序
39、是visual studio及其以前产品附带的visual source safe。在visual studio 2021中是新的team system,它供应了一种新的源代码掌握功能,可用于5人以上的团队。还有很多第三方供应商的解决方案和开放源代码的解决方案。 源代码掌握的完整争论超出了本书的范围,但即使是在小型项目上,也总是要使用某种源代码掌握,来确保项目源代码的平安。 2.4 使用page基类 默认状况下,应用程序中的全部wen窗体页面都继承自system.web.ui.page。这个类实现了作为httphandler的必要功能,运行库在检测到调用某个页面的恳求时,就会调用这个类。简洁地
40、说,httphandler是处理恳求的终端。page类是httphandler用于处理和显示web窗体的一种特定实现方式。第17章将举例说明执行httphandler来完成其他任务的方式。 为构建应用程序而建立体系结构模式时,找出削减冗余和敏捷构建的方式总是首要的任务。一种可以采纳的模式是定义一个页面基类,让全部的页面都继承这个基类,而不是system.web.ui.page。这样,即使最初没有使用它,也可以建立一个基础,以便添加全部页面都可见的属性和功能。这个新的基类继承自system.web.ui.page,这样就不必在新的页面基类中重复实现全部的功能了。这么做会使新的页面基类建立在sys
41、tem.web.ui.page36 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 类功能的基础之上。另外,这还将允许新的基类访问系统类的全部受爱护的属性、方法和大事。 下面的例子列出了baseuipage类的基本实现代码: / summary / base ui page / /summary public class baseuipage : system.web.ui.page public baseuipage() 即使这就是目前添加到该类中的全部代码,也为应用程序建立了一个可扩展的基础。一旦将它付诸实践,就可以在将来给基本页面添加属性、方法或大事处理程序,让它在使用这个基
42、类的全部页面上都起作用。 下一步是给应用程序添加一个web窗体,修改该web窗体的代码文件,以继承新的baseuipage类。下面的例子列出了使用新类baseuipage之前的代码后置文件: ' example partial class _default inherits system.web.ui.page end class /c# example public partial class default2 : system.web.ui.page protected void page_load(object sender, eventargs e) 下面是修改代码,以使用新类
43、baseuipage的情形: ' example partial class _default inherits baseuipage end class /c# example public partial class default2 : baseuipage 37 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 protected void page_load(object sender, eventargs e) 这看起来不错,但好像是多余的工作。本章的后面将探讨如何使用visual studio 2021中的导出模板功能,创建一个可重复使用的页面模板,以避开重复的修改
44、。明确地说,可以避开的重复修改是,把继承自system.web.ui.page改为继承自baseuipage。 依据所建立的应用程序的规模和简单性,可以考虑实现多层基本页面。例如,最底层的基本页面是一个有用类库的一部分,该类库不是本应用程序专用的。但继承这个类库是当前建立的应用程序所特定的。它可以供应在这个应用程序环境下比较有用的属性和方法,例如供应activeproductid。最终,假如有一组完成类似任务的页面,例如datainput或searchresults,就可以继承应用程序专用的基本页面,以创建一个与这组页面相关的页面。这些层都供应了扩展点,有助于削减页面中的冗余。 2.5 使用m
45、aster page master page是 2.0中的一个新增特性,也是窍门程序变成产品特性的一个典型例子。master page的目的是定义一个由页面使用的布局模板。在应用程序中,并不是全部的页面都必需使用master page。可以让应用程序在不同的页面上使用多个master page,有时这是很抱负的。master page可以定义一个或多个contentplaceholder区域,这样内容页面就可以使用master page上供应的默认内容,或者掩盖它们,供应自己的内容。web窗体页面使用master page特性,就变成了内容页面。内容页面仅供应在master page定义的co
46、ntentplaceholder中填充的内容。图2-6是一个定义了三个内容区域的master page示例。 图 2-6 38 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 在建立新的应用程序时,确定是否要使用master page的概念是很重要的。假如在开发循环的后期再打算,就必需修改每个页面,使之变成内容页面。 创建master page时,需要考虑由谁处理应用程序的外观和操作方式。我们定义的contentplaceholder会影响布局的敏捷性,所以必需认真考虑站点可能使用的各种配置。 看看图2-6中显示的示例的html标记,留意这三个placeholder控件都使用标准的
47、html表,在页面上组织它们。图2-6显示了上一个范例的html标记。留意contentplaceholder的名称分别是contentplaceholder1、2和3。使用默认名称并没有什么错,但建议选择其他名称,以便更清楚地描述内容区域的用途。这将有助于查看内容页面的开发人员更好地理解该区域的用法。例如,上面的区域叫作contenttopnav,在使用时会更清晰其用途。 form id=form1 runat=server div table width=100% tr td colspan=2 asp:contentplaceholder id=contentplaceholder1 r
48、unat=server / /td /tr tr td width=200px asp:contentplaceholder id=contentplaceholder2 runat=server / /td td asp:contentplaceholder id=contentplaceholder3 runat=server / /td /tr /table /div /form 还可以在运行期间动态修改master page,进而动态修改站点的布局。详见第17章。 在使用master page时,我们的页面并没有继承master page,而是合并了master page,生成复合的输
49、出页面。实际上,在页面类中,可以使用page.master属性访问活动的master page。默认状况下,这个属性是system.web.ui.masterpage类型。 可以在master page上添加定制的属性、方法和大事。使用下面的页面指令,可以修改属性的类型。下面的例子把page.master属性改为mvphacks.baseclasses.basemasterpage: % mastertype typename=mvphacks.baseclasses.basemasterpage % 或者 % mastertype virtualpath=/masters/sitemaste
50、r.master % 39 asp.net 2.0编程珠玑 高清版 2.0编程珠玑 假如master page的类型与mastertype指令上指定的类型不符,就会产生一个错误。例如,假如master page上有一个属性activeproductid,就可以使用强类型化的名称访问它,如下面的例子所示: this.master.activeproductid=50; 2.6 建立第一个内容页面 建立了basepage类,定义了master page,指定内容页面的布局后,就该使用它们了。内容页面与一般的web窗体不同,它们没有自己的窗体元素或其他标记,例如head /或body /,而只是用c
51、ontent控件引用master page上的contentplaceholder控件。下面的示例列出了一个页面的html标记,该页面使用了在图2-6中定义的master page: % page language=c# masterpagefile=/masterpage.master autoeventwireup=true codefile=default2.aspx.cs inherits=default2 title=untitled page % asp:content id=content1 contentplaceholderid=contentplaceholder1 run
52、at=server /asp:content asp:content id=content2 contentplaceholderid=contentplaceholder2 runat=server /asp:content asp:content id=content3 contentplaceholderid=contentplaceholder3 runat=server /asp:content 可以看出,在内容页面中并没有定义什么实际的东西。在上面的例子中,visual studio默认为master page中的每个contentplaceholder创建一个content控件。
53、假如不准备供应定制内容,而是继承或使用master page供应的默认内容,只需在内容页面中删除content控件,内容页面就会自动使用默认内容。 如前面介绍contentplaceholder控件的名称时所述,所使用的id值会显示在设计器中,允许开发人员确定他们在修改哪个区域。它们的默认名称是content1、content2和content3。当然,这没有什么用,最好把它们改为有意义的名称,例如topnav、leftnav和maincontent。何时修改这些值是比较敏捷的;假如在开头创建内容页面之前,没有在master page中修改contentplaceholder的名称,就必需更新
54、全部的内容页面。id值可以随时修改,且不会影响master page或其他内容页面。 获得内容页面基本上有4种方式。首先,可以添加一个新的web窗体,在显示add new webform对话框时,要求指定页面是否使用master page。假如选中了master page,下一个显示的对话框就允许选择要引用的master page,并在page标记的masterpagefile特性上引用它,将它添加到页面上,如前面的示例代码所示。其次,在页面的onpreinit大事处理程序中,可以在代码中设置master page。这种方式将在第16章中使用,第16章描述了如何在运行期间动态切换master
55、page。再次,可以在web.config文件中建立master page,但其缺点是,它将迫使项目中的全部页面都变成内容页面。最终,总是有一种能完成全部任务40 asp.net 2.0编程珠玑 高清版 第2章 开头新项目 的方式,即把已有的页面转换为内容页面。 建立好第一个内容页面后,就可以把相同的修改应用于添加到应用程序中的全部页面。假如喜爱自动方式,可参阅本章后面争论的导出模板一节。 2.7 建立主题 应用程序的外观和操作方式经常与其功能一样重要。master page解决了页面的布局问题,而主题给应用程序的外观和操作方式供应了敏捷性。简洁地说,它们供应了一种方式,可以从页面及其控件定义中删除样式。 使用主题可以定义全部的样式,包括gridview如何显示,以及logon控件的外观等。主题由一个或多个样式表、skin文件和相关的图像组成。使用一个或多个css样式表的概念在主题中照旧存在,现在还可以使用skin文件定义控件的样式属性。 skin文件可以包含控件的定义,但没有功能/操作属性,例如productid=5。这个控件定义类似于模板,在引用该主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车机加生产线操作工岗前诚信品质考核试卷含答案
- 巷道掘砌工岗前基础验收考核试卷含答案
- 玻璃钢制品模压工岗前安全防护考核试卷含答案
- 汽油煤油柴油加氢装置操作工持续改进测试考核试卷含答案
- 2025年工业AI视觉检测技术应用考试题库
- 2025年光网络人工智能运维(AIOps)技术考试试卷
- 2025年四川启赛微电子有限公司招聘15人设计工程师等岗位的备考题库及完整答案详解1套
- 杭州地铁科技有限公司2026届校园招聘9人备考题库(第一批)及答案详解(新)
- 2025年弥渡县紧密型医共体总医院招聘编制外卫生专业技术人员的备考题库及参考答案详解一套
- 2026年常州市卫生健康委员会直属事业单位公开招聘卫技人员备考题库有完整答案详解
- 医学心理学虚拟案例库建设
- 纯化水监测管理制度
- 流行性腮腺炎课件及卷子
- 家畜普通病学课件
- 雨课堂学堂云在线《身边的营养学》单元测试考核答案
- 2025年六枝特区考调试题及答案
- 2026年苏州工业职业技术学院单招职业技能测试必刷测试卷附答案
- 液化气站安全隐患排查整改台账
- 供热管网系统运行工岗前基础实操考核试卷含答案
- 男士吹风课件
- 《广东省水利工程白蚁防治能力评价标准(2021年版)》
评论
0/150
提交评论