我有一个网站项目,在其中我有一个在ascx文件中定义的用户Web控件。
该控件已添加到Site.Master中,并在页面上正确显示,一切正常。
我需要覆盖从Site.Master派生的其中一个页面上的某些控件字段。
// In OnLoad:
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID"));
问题是MyControlName未在子页面上注册为有效类型。如果我直接将子控件的第二个实例添加到子页面,则上述工作将根据需要进行,但如果控件未直接放在页面上,而是仅在母版页中定义,则类型未定义。控件不在命名空间中,并且是在项目中定义的,所以我不知道为什么它有这样一个问题的位置是合适的类型。
如果我在OnLoad中放置断点,则为控件列出的类型为ASP.my_control_name_ascx,但使用它也不起作用。
为什么子类不能引用正确的类型?我能解决这个问题吗?
谢谢!
答案 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"); }
}
希望这有帮助!