复制ASP.NETWebForm的几个技巧
你可以通过重用Web form和将Windows form代码引入到ASP.NET项目来提高开发效率。 by Roger Jennings 使用Visual Basic.NET的服务器控件(server contro
你可以通过重用Web form和将Windows form代码引入到ASP.NET项目来提高开发效率。
by Roger Jennings
使用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. 复制一个包含原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.编辑复制后的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.调整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.改正和名字有关的运行错误
提示: 如果你的项目中使用了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.aspx、DSML.aspx和XSDInferASP.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论坛中和大家分享你的技巧。
相关资源:
"Xsd.exe Workarounds for Complex Documents"中的XSDGen.sln是第一个运用本文中所描述的技巧导入ASP.NET Web form (XSDGen.aspx)的Windows form project。
"Access Directories Through Firewalls with DSML"中所描述的DSMLWin.sln及其ASP.NET复制品DSML.aspx是基于XSDGen.sln和XSDGen.aspx设计的。
来自"Generate XSD Schemas by Inference"中的XSDInferVB.sln以及XSDInferASP.aspx是基于XSDGen.aspx和DSML.aspx的最新版Windows和Web form复制品。
"Test-Drive Microsoft's New Web Services Development Kit"中描述的WSDKClient.sln和Quickstart.aspx用button在Textbox中显示secure SOAP请求和响应消息。
SecureClient.aspx、Quickstart.aspx和X509Client.aspx是第一个WSDK Web form project的ASP.NET复制品。 本文作者:佚名 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读