我们以前的项目很多都用了页面继承和用户控件的继承,由于Code-behind模型和编译模型的变化,实现它们的方法也有了一些变化。
1.动态装载UserControl
在1.x里,动态装载UserControl是很简单的,
例如:MyControl myControl = (MyControl)LoadControl("~/MyControl.ascx");
而在2.0里,却还需要在页面里加上<%@ Reference Control="~/MyControl.ascx" %>
这里就有了一个问题,如果我要装载的UserControl是不可预知的,那我必需把在页面添加所有的可能的UserControl引用,麻烦。
再如果我可能在运行时生成UserControl,那么装载这样的UserControl,那就还必需在动态修改页面的引用
2.UserControl继承
在1.x里,例如有 UserControl基类
public class BaseUserControl : System.Web.UI.UserControl{...}
继承:
public class DerivedControl :BaseUserControl{...}
BaseUserControl只需要在一个CS文件定义就可以(BaseUserControl只是一个普通的类)
在2.0中,则BaseUserControl必需定义在一个UserControl里面,就是BaseUserControl必需是一个完整的UserControl(包括*.ascx和*.ascx.cs或*.ascx.vb)
假如已经定义一个完整的BaseUserControl
继承:
在DerivedControl.ascx.cs中
public partial class DerivedControl : BaseUserControl{}
在DerivedControl.ascx中必需添加 <%@ Reference Control="~/BaseUserControl.ascx" %>
而且它还必需在<%@Control%> 的前面
<%@ Control Language="C#" AutoEventWireup="true" CodeFileBaseClass="BaseUserControl"
CodeFile="~/DerivedControl.ascx.cs" Inherits="DerivedControl" %>
CodeFileBaseClass指定父类类型
3.Page继承
与UserControl继承类似,需要从一个完整Page×(包括*.aspx和*.aspx.cs)来继承
在1.x里,例如有 Page基类
public class BasePage : System.Web.UI.Page{...}
在DerivedPage.aspx.cs中
public partial class DerivedPage : BasePage{}
在DerivedPage.aspx中必需添加 <%@ Reference Control="~/BasePage.aspx" %>
它也必需在<%@Page%> 的前面。
<%@ Control Language="C#" AutoEventWireup="true" CodeFileBaseClass="BasePage"
CodeFile="~/DerivedPage.ascx.cs" Inherits="DerivedPage" %>
要指出的是DerivedPage.aspx存根代码(即ASPNet2.0由*.aspx自动生成的那部分)会隐藏BasePage.aspx的存根代码
(UserControl也一样)例如在BasePage.aspx中定义一个控件如Label1,而在DerivedPage.aspx没有定义它,而在DerivedPage中加入了操作Label1的代码,在预编译的时候,都是正常的,但在运行时访问DerivedPage.aspx就会报错,指出对Label1引用没有指定到一个对象的实例。那么我们可以简单地认为,在运行时,ASP.Net只会对所请求的页面的控件进行实例化,当然我们也可以在后台手工进行控件实例化。当然我们访问BasePage.aspx是不会有错的。
ZZ自http://pengnian.cnblogs.com/archive/2005/12/06/292047.html