【问题标题】:Unable to call an ASP.NET user control from another无法从另一个调用 ASP.NET 用户控件
【发布时间】:2011-03-23 05:29:15
【问题描述】:

我希望从另一个用户控件访问用户控件的公共属性。 但是,我无法访问另一个用户控件中的一个用户控件。即使在使用命名空间“ASP”之后,我也只能看到对当前用户控件的引用。

但是,在一个页面中,我可以使用 ASP 命名空间引用所有用户控件。

我是错过了什么还是需要这样?

更新: 这里是确切的场景 -
我有两个用户控件 A 和 B。现在它们都在 Page Default.aspx 上使用。控件 A 上有一个公共属性,其中包含在 A 中单击的控件的名称。我希望访问控件 B 中的此属性以做出一些决定。 根据您的建议,我了解通过容器页面的 FindControl 方法到达控件,但是当我无法在 B 中获取控件 A 的引用时,如何将其转换为控件 A 以获取属性值?

感谢大家的帮助!

【问题讨论】:

  • 我认为你遗漏了一些东西。也许发布您的两个用户控件的相关代码以及您如何在页面上使用它们
  • ^^ 希望更新后的问题描述清楚...

标签: c# asp.net user-controls


【解决方案1】:

一个用户控件不应该知道另一个用户控件(当然,任何包含的子控件除外)。如果 ControlABC 引用了 ControlXYZ,那么您永远不能在任何页面上使用 ControlABC,除非该页面也有 ControlXYZ 的实例 - 这会严重影响您重用 ControlABC 的能力。

解决此问题的一种方法是使用事件来“连接”两个控件之间的连接。这样一来,ControlABC 对 ControlXYZ 没有很强的依赖性——即使在没有 ControlXYZ 的页面上,它也可以很容易地重复使用。该页面可以管理两个控件之间的连接,将 ControlXYZ 上的委托添加到 ControlABC 上的事件中,从而使两个控件可以进行通信。

可能还有其他技术可以让您的控件在不引入强依赖关系的情况下相互交互,与事件/委托相比,这可能有利有弊。我敢肯定,其他 SO 成员会指出它们。

【讨论】:

  • 好吧,“你永远不能在任何页面上使用 ControlABC,除非该页面也有 ControlXYZ 的实例”......在不知道控件是什么的情况下,这可能是一个完全合理的要求。
【解决方案2】:

“命名空间”与“范围”不同:命名空间只是一种对类定义进行排序的方式。范围是您可以在代码中的特定点看到的变量(实例)。

其他用户控件在同一页面上? (如果没有,那么它根本不起作用)。 您将需要从当前用户控件转到页面。从那里您可以找到其他用户控件。

【讨论】:

    【解决方案3】:

    这正是它需要的方式。

    在我看来,像这样将一个用户控件耦合到另一个用户控件似乎是个坏主意。无法保证两者都会出现在页面上。

    如果没有其他办法,用户控件确实可以访问页面。然后,您可以使用 Page.FindControl 查找其他用户控件并以这种方式访问​​其公共属性。

    【讨论】:

    • 如果一个/两个用户控件都实现了一个接口,这不一定是坏事。
    • 但是为了访问公共属性,我需要将其转换为相应的cobtrol,当我没有引用它时我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多