【问题标题】:Server ccntrols in user control are null when user control serves as a base user control (asp.net)当用户控件用作基本用户控件 (asp.net) 时,用户控件中的服务器 ccntrols 为空
【发布时间】:2011-02-27 21:29:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    问题:

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

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

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

    修复:

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

    那么当你继承这个类时,所有相同的代码都会被执行,确保你的子用户控件里面有相同的UI控件。

    【讨论】:

    • 我希望基本用户控件能够访问其自己的 acsx 文件上的控件。这不是子用户控件尝试访问父控件的情况。基本用户控件是一个独立的控件。当另一个用户控件从它继承时,基本用户控件不再像自包含用户控件那样工作。我提到我希望在 ascx 文件中声明控件而不是以编程方式创建控件是有原因的。那么如果不以编程方式创建控件,就没有办法使这项工作吗?
    • 没错,没有办法。 .ASCX 文件适用于可重复使用的小块内容,实际上并不是为了分发或继承而构建的。
    猜你喜欢
    • 2015-03-11
    • 2011-01-22
    • 2010-10-30
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多