在子页面中找不到.master控件类型中添加的Web控件

时间:2010-06-07 13:13:27

标签: c# asp.net webforms

我有一个网站项目,在其中我有一个在ascx文件中定义的用户Web控件。

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

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

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

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:1)

该控件在整个项目中没有全局范围。它只能作为注册控件的页面上的类型进行选择。所以你必须在子页面上注册控件:

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

您需要将上述注册标记添加到子aspx页面的顶部。

另一个选项是您可以为控件创建一个接口,该接口公开您要访问的属性或方法,并将接口放在app_code或其他一些全局可访问的位置,然后让控件实现接口,并转换为控制界面。

答案 1 :(得分:1)

以下代码适用于我:

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

答案 2 :(得分:0)

我认为GetBaseMasterPage()是你自己的方法吗?如果你尝试会发生什么:

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

答案 3 :(得分: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"); }
}

希望这有帮助!