复制ASP.NET Web Form的几个技巧

使用Visual Basic.NET的服务器控件(server control)和自定义ASP.NET模板能使你快速轻松地在一个普通的Web form theme中生成变更(variation)。但是如果你没有预制用于Web应用程序的服务器控件或者页面模板(或两个都没有),那么你只能构建一个新的项目或对最初的Web form进行复制了。更改用户界面和代码,然后对一个相关ASP.NET solution进行Xcopy重新部署(redeployment)通常会比重新构建一个新的ASP.NET Web form项目更加高效。

如果你试过我在近期的FTPOnline XML Web services and schemas文章中讲到的ASP.NET测试工具(test harnesses) (见资源), 你可能会发现大多数可下载的Windows form工具的Web form复制品都有相同的设计。一个很大的textbox用来显示XML文档、schemas、SOAP消息以及验证结果,它们是依照程序的类别来选取的。按钮(它有时看起来像是tab,用来模拟Windows form的tab控件)或文档选取(document-selection)下拉列表用来处理刷新文本框内容的postback。

通过复制最初的Web form设计并将其用在几个后续的项目中 (XSDGen.aspx),使我节省了很多开发Web form UI的时间。本文中我将讲解我用过的几个复制技巧,以及如何避免一些复制过程中出现的错误。

复制后的Windows form项目的Xcopy部署内容是一个简单的基本框架,而ASP.NET主要依靠的是solution、project和页面文件,这些都需要进行手动编辑来得到一个新的虚拟目录、项目和页面名称。以下内容告诉你如何在开发服务器中得到一个在新的虚拟目录下运行的ASP.NET 项目的复制品:

图1.
图1. 包含复制文件的列表
1. 复制一个包含原ASP.NET Web forms应用程序的文件夹,将其重新命名为一个新的项目并将它放到你的服务器中。比如,原项目文件夹是OakLeaf Web server中的 D:\OakLeafWS\WSDKSecClientASP,而新文件夹(目的文件夹)则会是位于我的机器中的D:\OakLeafWS\WsdkX509ClientASP。

提示: 如果你的ASP.NET 代码访问的是本地目录,你可以用部署服务器(deployment server)中的逻辑驱动器(logical drive)和机器路径来解决最终的部署问题。

2. 建一个指向新文件夹的IIS虚拟目录。比如,这个虚拟目录和新文件夹使用相同的名字: WsdkX509ClientASP。

3. 在SourceProjectFolder的所有文件的文本中查找SourceProjectName(见图1)。这个列表中包括所有需要更改名称和内容的文件。

4. 在Notepad中打开SourceProjectName.sln,将http://localhost/SourceVirtualDirectory/SourceProjectName.vbproj改成http://localhost/NewVirtualDirectory/SourceProjectName.vbproj (见图2,顶部),并保存文件。(如果需要的话还可以更改localhost或者原域名,但不要改SourceProjectName。)

图2.
图2. 编辑复制后的Solution文件
修改PageName.aspx文件的类名
更新Global.asax文件
提示: 如果不改变SourceProjectName.sln 则无法打开复制后的solution。

5. 在Visual Studio .NET中打开SourceProjectName.sln,查看PageName.aspx 文件中的FullPath属性以检验改文件是否被包含在NewProjectName文件夹中。

6. 在Project Explorer中,将Startup Page设定为适当的PageName.aspx文件。

7. 按F5编译并运行项目。

8. 在Project Explorer中,将solution和project的名字从SourceProjectName改为NewProjectName,并重复6和7。

9. 在Notepad中打开SourcePageName.aspx文件并将Inherits="SourceProjectName.SourcePageName" 属性值改为Inherits="NewProjectName.SourcePageName" (见图2,中部)。

10. 在Notepad 中打开Global.asax,将Inherits=SourceProjectName.Global改为Inherits= NewProjectName.Global (见图2,底部),保存文件。

11. 删除SourceProjectName.vsdisco或将其重命名为NewProjectName.vsdisco。

12. 打开NewProjectName Property Pages对话框,将Assembly Name和Root Project Namespace从SourceProjectName改为NewProjectName(见图3 )。

图3.
图3. 调整Assembly name和Root namespace
提示: 如果文件是在designer状态下则无法改变Root Namespace。

13. 编译并运行项目。如果你遇到一个和图4中相类似的错误消息,你就要检查一下有没有准确完成4、9和10。(图4中举例说明在Global.asax 出问题时会出现何种错误)。

14. 从...\bin 文件夹中删除SourceProjectName.dll 和SourceProjectName.pdb 文件。

15. 将SourcePageName.aspx文件重命名为NewPageName.aspx。这些更改是为了执行每一个页面的指示(directives)。

16. 如果代码中还包括SourceProjectName的references,比如文件夹路径(folder path),你需要在设计页面中同时打开所有代码和Web.config。找到SourceProjectName并用NewProjectName代替它。

图4.
图4. 改正和名字有关的运行错误
提示: 如果你的项目中使用了Web Service Development Kit性能(比如tracing),则更改Web.config中的文件名属性值就是非常重要的了。

17. 编译并运行更新后的项目。

改写原先的UI
现在,你可以对UI和form后的代码进行修改了。比如,SecureClient.aspx原先的UI和新的X509Client.aspxUI几乎是相同的。明显的区别是form title、Baseline Time替换(substitution)和用于Integer A和Integer B textbox的Include Proxy Time checkbox,以及按钮下方的三个checkbox的名称。

可能的话,用等效的ASP.NET来取代不被支持的Windows form控件。比如,你可以用TabStrip/Multipage 控件结合(control combination)或第三方等效控件来取代Tab控件。如果想用一种更简单的方法,你可以试试使用自定义按钮来模拟Tab。其结果并不特别让人满意,但用起来很快,而且容易编写代码。在XSDGen.aspxDSML.aspxXSDInferASP.aspx页面中举例说明了如何用HTML 按钮来代替Windows form Tab控件。

引入并修改Windows Form代码
如果你不仅仅想要改变UI以使得Web form的风格有所改变,或者想要添加一个新的性能,那么你可能需要替换页面后的大多数甚至是所有代码。或许你还需要添加新的.NET或COM references。比如,references不变,但新的代码却来自于Visual Basic .NET WsdkX509Client Windows form项目(我在“Compare Web Service Security Metrics”一文中曾讲解过)。Visual Studio Magazine的主编Patrick Meader曾在2002年8月的“Microsoft Maps Out.NET Road”社论中这样讲到:

“(一个)开发人员最近让我看了他的一个Web程序,他在新建了两个相同的Windows Form和 Web Form之后,直接从Desktop复制了一段代码并把它粘贴到Web程序中去了。你可能希望能同时拥有desktop和Web两个版本的程序,但除了一些很小的程序之外,类似于这样的程序是会随时崩掉的。”

将一个4000行的Windows form应用程序复制粘贴到我的ASP.NET OakLeaf Consumer Electronics Order Processing Test Form Web services consumer中只需要做很少的改动。对一个WsdkX509Client的1166行代码应用程序来说同样如此,只需花不到30分钟的时间修改ASP.NET标准就可以了。我的“复制粘贴”项目没有一个是很小的项目,但它们都只包含一个单一的Windows form。

根据我的经验,我总结出一些从单个Windows forms 中将Visual Basic .NET代码引入ASP.NET中的技巧:

删除所有专门用在Windows form中的代码,比如Cursor属性设置以及MsgBox声明或函数。你需要将错误消息发送到textbox中。
更改控件的名称以使其和被引入的事件处理名称相匹配。
将Form_Load和Form_Activate事件处理中的代码移到Page_Load处理中。
在用户首次打开form或page load运行的代码时,在Page_Load处理中使用一个session state变量来区分每个单一实例的操作。(见列表1)。大多数OakLeaf测试客户端都会在首次运行session的page load时自动显示帮助文本。
在服务器来回运转时尽量不要用EnableViewState = True来保持控件的状态。包括大量文本的控件的可视状态(view state)会大量消耗服务器的资源。Select Payload下拉列表是唯一一个需要保持ViewState的控件。
将AutoPostBack = True仅仅用于需要在服务器间来回往复的控件(通常是一些button或tab)。不必要的刷新form会消耗服务器的资源。范例form中的postback控件只有四个按钮和下拉列表。
在代码的关键部分加入Trace.Write指示来跟踪Web form客户端的运行时间。

本文的例子使用了Visual Basic .NET,但这些技巧同样适用于C#以及其他CLR编程语言。

复制ASP.NET Web form并将Windows form代码引入ASP.NET页面使我很受益。如果你有其他方法在普通的Web form theme中重新部署变更,你可以在ASP.NET论坛中和大家分享你的技巧。


关于作者:
Roger Jennings是OakLeaf Systems的负责人,是FTP网站的专栏作家,是 Visual Studio Magazine的撰稿编辑。他主要研究的领域是XML Web services、客户端/服务器应用程序和XML/XSLT数据库应用程序。Roger的最近的著作包括 Visual Basic .NET XML Web Services Developer’s Guide (Osborne/McGraw-Hill)、Special Edition Using Access 2002 (Que)、Special Edition Using Windows 2000 Server (Que)、Admin911: Windows 2000 Group Policy (Osborne/McGraw-Hill)以及Database Developer’s Guide with Visual Basic 6 (Sams)。OakLeaf的 U.S. Code of Federal Regualtions XML Web services最近获得了 Micorosoft .NET Best Award的嘉奖。Roger的联系方式是 Roger_Jennings@compuserve.com

转载于:https://www.cnblogs.com/kanshangren/archive/2004/03/22/3913.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值