当用户控件充当基本用户控件(asp.net)时,用户控件中的服务器ccntrol为null

时间:2010-06-04 16:32:31

标签: asp.net user-controls

我不认为我完全理解ASP.NET如何继承控件。 我有一个用户控件ucBase,它在ascx文件中有一个asp.net标签。后面的代码引用标签,如果控件不是另一个用户父级的父级,它在运行时可以正常工作。

如果我有另一个用户控件,ucChild,继承自ucBase,ucBase代码中的标签始终为null。 ucChild在其ascx文件中没有控件

服务器控件(如标签)需要在ascx文件中声明,而不是以编程方式创建。

当ucBase是父用户控件时,需要做些什么来查看自己的控件?

1 个答案:

答案 0 :(得分:1)

问题:

继承只继承用户控件的代码部分。标记不是可以继承的东西,因为它是在运行时动态编译的。

标记和代码隐藏之间的关系是通过用户控件附带的.designer.cs部分类完成的。此设计器文件包含标记中所有对象的声明。这基本上用一堆空对象引用的字段来装饰代码隐藏类 - 这些将在运行编译的标记代码时用实际实例初始化。

从.ascx文件继承时,将继承所有这些空对象占位符。但是,由于新控件中的标记与父控件不同,因此当新控件的标记不包含相应的标记时,实际上不会创建这些对象,并且在解析和编译时,所有引用都保持不变空值。这有意义吗?

修复:

执行此操作的最佳方法是使用户控件自包含,即支持基于代码的组合而不是基于标记。换句话说,不是使用标记,而是使用Page_Init设置用户控件,并将所需的所有控件添加到后面代码中的Controls集合中。

然后,当您继承此类时,将执行所有相同的代码,确保您的子usercontrol具有相同的UI控件。