2010-06-07 90 views
2

我有一个Web站点项目,并在其中有一个用户Web控件定义在一个ascx文件中。在.master控制类型中找不到子控件页面中的Web控件

该控件被添加到Site.Master中,并且它在页面上正确显示并且一切正常。

我需要覆盖派生自Site.Master的其中一个页面上的某些控件的字段。

// In OnLoad: 
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID")); 

问题是MyControlName未在子页面上注册为有效类型。如果我直接向子页面添加第二个控件实例,上面的工作将根据需要进行,但如果控件不是直接放在页面上,而是仅在母版页中定义,则该类型是未定义的。该控件不在名称空间中,并在项目中定义,所以我不知道为什么它有这样的问题位置适当的类型。

如果我在OnLoad中放置了一个断点,那么为控件列出的类型是ASP.my_control_name_ascx,但使用它也不起作用。

为什么孩子类不能引用正确的类型?我能解决这个问题吗?

谢谢!

回答

0

我接受GetBaseMasterPage()是你自己的方法吗?如果尝试:

MyControlName control = (MyControlName)Page.Master.FindControl("controlId"); 

+0

是的,这是我们自己的功能。我们有一个网站的主人,和科大师。并非所有节主都必须从网站主控继承,所以该功能只能运行到“最高”主页面。 如果在页面上放置了控件的第二个实例,则该代码正常工作。即它将控件定位在主控件上并更新主控页面控件的状态,但只有当子页面上有控件的实例时才会这样。否则,编译器会说这是一个未知的类型。所以这只是一个类型解析问题,而不是功能问题。 – turtle 2010-06-07 17:59:13

+0

关于该代码示例的快速(迂腐)点;你需要支持Page.Master来获取类型转换:MyControlName control =((MyControlName)Page.Master).FindControl(“controlId”); – 2010-10-12 14:15:27

+0

我不明白为什么,Page.Master是MasterPage类型的属性,它继承自Control,它具有FindControl方法。您只需要投射结果,这是FindControl方法的结果,您不需要进一步括号。 – 2010-10-12 14:54:04

1

控件在整个项目中没有全局范围。它只能在控件注册的页面上选择。所以,你必须注册子页面上的控制:

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %> 

你需要像上面添加一个寄存器标记你的孩子aspx页面的顶部。

另一种选择是你可以为控件创建一个接口,它暴露你想要访问的属性或方法,并将接口放在app_code或其他全局可访问的位置,然后让控件实现接口并投射控制界面。

0

不直接回答你的问题,但你可能会发现@MasterType directive有用。

如果添加喜欢

<%@ MasterType TypeName="ClientName.SiteName.MasterPages.SiteMaster" %> 

一行到你的ASPX页面的顶部,你应该能够引用母版页中的代码,而不必强制转换。这可能会让代码更容易找到你的控件,或许?

你可以用一条线落得像:

// In Page.OnLoad: 
MyControlName control = Page.Master.MyControl; 

,然后在您的主页公开了新的属性,包装了FindControl电话:

// In Site.master.cs 
internal MyControlName MyControl 
{ 
    get { this.FindControl("controlID"); } 
} 

希望这有助于!

1

下面的代码对我的作品:

DropDownList ddlLanguage = (DropDownList)Page.Master.FindControl("ddlLanguage");