从其他用户控件加载用户控件(ascx)

时间:2013-02-19 20:45:30

标签: c# asp.net controls ascx webusercontrols

我有一个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");

这个(及其变体)告诉我它不存在。

原来如此!有什么想法吗?

3 个答案:

答案 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。不管怎样,谢谢你们。我很感激。