繁体   English   中英

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

[英]Server ccntrols in user control are null when user control serves as a base user control (asp.net)

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

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

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

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

问题:

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

标记和后台代码之间的关系是通过用户控件随附的.designer.cs子类完成的。 该设计器文件包含标记中所有对象的声明。 这基本上用一堆作为空对象引用的字段修饰了代码隐藏类-当运行已编译的标记代码时,这些字段将使用实际实例进行初始化。

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

解决方法:

最好的方法是使您的用户控件自成体系,即支持基于代码的组合而不是基于标记的组合。 换句话说,不是使用标记,而是使用Page_Init设置用户控件,并将所需的所有控件添加到后面的代码中的Controls集合中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM