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

当用户控件用作基本用户控件(asp.net)时,用户控件中的服务器控件为空,asp.net,user-controls,Asp.net,User Controls,我不认为我完全理解ASP.NET如何继承控件。 我有一个用户控件ucBase,它在ascx文件中有一个asp.net标签。代码隐藏引用标签,如果控件不是另一个用户父级的父级,则它在运行时可以正常工作 如果我有另一个用户控件ucChild继承自ucBase,则ucBase代码中的标签始终为空。ucChild的ascx文件中没有控件 服务器控件(如标签)需要在ascx文件中声明,而不是以编程方式创建 当ucBase是父用户控件时,需要做什么才能让它看到自己的控件?问题: 继承仅继承用户控件的代码部分

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

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

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


当ucBase是父用户控件时,需要做什么才能让它看到自己的控件?

问题:

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

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

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

修复方法:

实现这一点的最佳方法是使用户控件自包含,即支持基于代码的组合,而不是基于标记的组合。换句话说,不要使用标记,而是使用Page_Init设置用户控件,并将所有需要的控件添加到代码隐藏中的控件集合中


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

我希望基本用户控件在其自己的acsx文件上访问其自己的控件。这不是试图访问父控件的子用户控件的情况。基本用户控件是一个自包含控件。当另一个用户控件从中继承时,基本用户控件不再像自包含的用户控件那样工作。我提到我希望控件在ascx文件中声明,而不是通过编程创建,这是有原因的。那么,如果不以编程方式创建控件,就没有办法实现这一点吗?没错,没有办法。ASCX文件用于可重用的小块内容,实际上并不是为了分发或继承而构建的。