在给定成员对象的情况下获取对当前类(ascx或aspx)的引用

时间:2011-03-14 17:44:16

标签: asp.net webforms

给定某个文件中的控件SomeControl的实例(可能是usercontrol / ascx或aspx),如何获取它所属的类的引用?

在用户控件中,SomeControl.NamingContainer似乎是可靠的。

在继承自MasterPage的页面中,这将返回对ContentPlaceHolder的引用,而不是定义aspx的实际类。在这种情况下我想要的是SomeControl.Page

Parent将返回heirarchy中的父控件,因此没有多大用处。

有什么方法可以直接得到它,无论它是什么类型的东西?

2 个答案:

答案 0 :(得分:0)

您需要区分成为类的成员,以及作为页面上的可寻址控件。有一个区别 - 一个是面向对象编程语言的属性,另一个是添加到ASP.NET的WebForms实现的构造。

将控件添加到default.aspx会将该控件添加到页面的Controls集合中。然后,设计者会自动将引用添加到页面类,只要相关控件未包含在另一个控件模板中(或者该模板被标记为InstanceTemplate,如ContentPlaceholder)。该引用基本上是围绕Page.FindControl的快捷方式。

控件的NamingContainer是第一个通过实现INamingContainer接口来负责确保其内部控件唯一性的ParentControl。

听起来你要做的就是找到与控件相关的页面?为此,您需要遍历控制树(遵循每个控件上的.Parent属性),检查父级是否为Page类型。

答案 1 :(得分:0)

您必须以递归方式使用Parent属性:

public Control GetParent(Control ctl)
{
  Control parent = ctl.Parent;

  while (parent != null)
  {
     if (parent is UserControl || parent is Page)
        return parent;

     parent = parent.Parent;
  }

  return ctl.Page;
}

这样的事情。这是识别控件的父容器的唯一方法,无论是在UC还是Page中。控件只能识别页面,而不能识别它所属的用户控件,除非通过Parent属性。

HTH。