2

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

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

所以!有什么想法吗?

4

3 回答 3

1

一种有用的解决方案是添加<%@ Register %>到您的父控件。是的,我知道它在您的父页面中,但它也应该在您的控制范围内。

如果你这样做,你应该能够强类型你的控件。例如,类名称为的控件MyControl将是:

MyControl controlVar = (MyControl)this.LoadControl("MyControl.aspx");

如果您能够获得 stronly 定义的变量,那么您应该没有问题。

于 2013-02-19T21:04:39.513 回答
1

哈!我真是个笨蛋!我在这样的控件中声明了“SideBarWelcome”:

public Control sideBarTopWelcome
{
    get { return Page.FindControl("SideBarTopWelcome"); }
}

当我应该这样做时:

public Control sideBarTopWelcome
{
    get { return FindControl("SideBarTopWelcome"); }
}

没有Page. 无论如何,谢谢你们。我很感激。

于 2013-02-19T22:24:35.507 回答
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);
于 2013-02-19T21:06:58.997 回答