常见转换问题
尽管 ASP.NET 2.0 可以处理在 ASP.NET 1.x 中开发的代码,但是您仍然可能会遇到一个或多个常见转换问题。在本部分中,我们将着眼于几个最常见的问题。
代码分离 (CB-CB) 破坏的引用
注意:CB 是表示用于 Web 窗体或用户控件的代码分离文件(*.aspx 或 *.ascx)的缩写词。
新的 ASP.NET 2.0 编译模式使用通常在服务器上动态编译的多个程序集。此模式改善了 Web 站点的性能和可更新性。
但是如果 ASP.NET 1.x 代码分离文件引用另一个代码分离文件,那么引用将被破坏,因为引用的代码分离文件将不再位于同一个程序集中。
下面列出了可能导致这种问题的常见情况:
| • |
使用 LoadControl() 并将结果转换到另一个用户控件,例如 |
| • |
创建 Web 窗体类的实例,例如 |
如何修复
要解决此问题,需要更改应用程序以使其能够找到引用。既然这是一个 CB-CB 破坏的引用,因此解决问题的最简单的方法就是向进行引用的 Web 窗体或用户控件添加一个引用指令。此方法将告知编译器要链接到的程序集。
假定您处于以下情况:
| 原 ASP.NET 1.x 代码 | |
| 文件(位于 WebAppRootFolder 下) | 代码 |
|
Page1.ascx |
|
|
- Page1.ascx.cs |
Control1 c = (Control1)LoadControl("~/Control1.ascx"); |
|
Control1.ascx |
|
|
- Control1.ascx.cs |
|
更改代码以使用引用指令:
| ASP.NET 2.0 版本 | |
| 文件(位于 WebAppRootFolder 下) | 代码 |
|
Page1.ascx |
<%@ Reference Control="~/Control1.ascx" %> |
|
- Page1.ascx.cs |
Control1 c = (Control1)LoadControl("~/Control1.ascx"); |
|
Control1.ascx |
|
|
- Control1.ascx.cs |
|
通过使用该引用指令,明确地告知编译器查找要使用的 Web 窗体或控件的位置。请注意,在 Visual Studio 2005 的最终版本中,转换向导将自动执行此操作。
独立类文件 (SA?"CB) 破坏的引用
注意:SA 是表示独立类文件的缩写词。
如果某个独立类文件引用了代码分离文件中的代码,则您可能会遇到另一种破坏的引用。这种引用与 CB-CB 破坏的引用相似,只不过 App_Code 目录下的某个独立类文件试图引用单独的页面程序集。同样,会导致这种问题的常见情况包括使用 LoadControl() 调用或创建 CB 类的实例。
如何修复
修复 SA-CB 破坏的引用要复杂的多。既然问题发生在 SA 文件中,您就不能使用引用指令来查找该引用。而且,转换之后,SA 文件将移到 App_Code 目录下,因此您只能在 App_Code 程序集被编译后访问该程序集。
解决方案是在 App_Code 目录下创建要在编译时引用的抽象基类,这将在运行时从页面程序集加载实际类。
假定您处于以下情况:
| 原 ASP.NET 1.x 代码 | |
| 文件(位于 WebAppRootFolder 下) | 代码 |
|
Control1.ascx |
inherits="Control1" |
|
- Control1.ascx.cs |
class Control1 :System.Web.UI.Page { |
|
Code1.cs |
Control1 c = (Control1)LoadControl("~/Control1.ascx"); |
更改代码以使用引用指令:
| ASP.NET 2.0 版本 | |
| 文件(位于 WebAppRootFolder 下) | 代码 |
|
Control1.ascx |
inherits="d_Control1" |
|
- Control1.ascx.cs |
class d_Control1 :Control1 { |
|
App_Code\Code1.cs |
Control1 c = (Control1)LoadControl("~/Control1.ascx"); |
|
App_Code\Stub_Control1.cs |
abstract class Control1 :System.Web.UI.Page { |
由于抽象集类现在位于 App_Code 目录下,因此它将允许独立类文件和 CB 文件在编译过程中查找类(在本示例中名为 Control1)。但是,在运行时,独立类文件将使用后期绑定来加载原始类(在本示例中重命名为 d_Control1)。请注意,在 Visual Studio 2005 的最终版本中,转换向导将自动为您创建此代码。
