我有一个UserControl(ascx),根据用户的凭据,将加载另一个UserControl(ascx)。目前要加载的控件包含一个特殊的导航菜单。
我正在使用此代码:
UserControl jmNav =
(UserControl)Page.LoadControl("~/controls/client/jmNavigation.ascx");
然后,在更多代码之后,我告诉它加载,如下:
SBarTopWelcome.Controls.Add(jmNav);
问题是,我得到的“对象引用没有设置为对象的实例”错误。
是的,路径是正确的 - 正如我尝试的那样(在所有变体中):
UserControl jmNav = (UserControl)Page.LoadControl("/client/jmNavigation.ascx");
这个(及其变体)告诉我它不存在。
原来如此!有什么想法吗?
答案 0 :(得分:1)
一个有用的解决方案是将<%@ Register %>
添加到您的父控件。是的,我知道它在你的父页面中,但它也应该在你的控制之下。
如果你这样做,你应该能够Strongly-Type你的控制权。例如,类名为MyControl
的控件将为:
MyControl controlVar = (MyControl)this.LoadControl("MyControl.aspx");
如果你能够获得stronly定义的变量,你应该没有问题。
答案 1 :(得分:1)
在 SideBar.ascx 内添加名为 SideBarTopWelcomePlaceHolder 的占位符。
<asp:PlaceHolder ID="SideBarTopWelcomePlaceHolder" runat="server"/>
然后将 jmNavigation UserControl加载到 SideBarTopWelcomePlaceHolder ,就像这样。
Control jmNav =
Control Page.LoadControl("~/controls/client/jmNavigation.ascx");
SideBarTopWelcomePlaceHolder.Add(jmNav);
答案 2 :(得分:1)
HA!我真是个傻瓜!我在这样的控件中声明了“SideBarWelcome”:
public Control sideBarTopWelcome
{
get { return Page.FindControl("SideBarTopWelcome"); }
}
当我应该这样做的时候:
public Control sideBarTopWelcome
{
get { return FindControl("SideBarTopWelcome"); }
}
没有Page
。不管怎样,谢谢你们。我很感激。