【问题标题】:Loading User Controls (ascx) from other User Controls从其他用户控件加载用户控件 (ascx)
【发布时间】:2013-02-19 20:45:29
【问题描述】:

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

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

所以!有什么想法吗?

【问题讨论】:

  • 这是一个经典的“我在哪里创建我的控件”的问题。您从哪个事件中致电UserControl jmNav = (UserControl)Page.LoadControl("~/controls/client/jmNavigation.ascx)
  • 我有一个“受保护的空白”,它正在加载从标签到 css 类以及用户控件的所有内容 - 它在页面加载时被触发。
  • 您是否在标记中添加了Register 行?
  • 我已经尝试过了——但在其他页面上,没有必要——不过,那些是在页面 (aspx) 上,而不是在用户控件 (ascx) 上。我什至做了一个“
  • 您是否能够强定义用户控件,或者您只是使用基类(如Control)?

标签: c# asp.net controls ascx webusercontrols


【解决方案1】:

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

如果你这样做,你应该能够Strongly-Type你的控制。例如,类名为MyControl 的控件将是:

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

如果你能得到 stronly 定义的变量,你应该没有问题。

【讨论】:

  • 我在父控件中也有 ,但没有太大区别。
【解决方案2】:

SideBar.ascx 中添加一个名为 SideBarTopWelcomePlaceHolder 的占位符。

<asp:PlaceHolder ID="SideBarTopWelcomePlaceHolder" runat="server"/>

然后像这样加载jmNavigation UserControl到SideBarTopWelcomePlaceHolder

Control jmNav = 
    Control Page.LoadControl("~/controls/client/jmNavigation.ascx");
SideBarTopWelcomePlaceHolder.Add(jmNav);

【讨论】:

  • 这很酷,但是 - 我正在使用这个: public Control SBarTopWelcome { get{ return Page.FindControl("SideBarTopWelcome");} } 这给了我“SBarTopWelcome” - 这有什么不同吗?
  • 没有。只要 SideBarTopWelcome 不为 null,就可以在 SideBarTopWelcome 的 PlaceHolder 中添加控件。
  • 我更新了答案。您需要显式转换为 SideBarTopWelcome 控件才能访问 PlaceHolder。
  • "public SideBarTopWelcome SBarTopWelcome" 不能那样发生。 SideBarTopWelcome 是一个
    (给定 id,并添加了 runat 服务器) - 这适用于其他页面 - 只是不知道为什么它在这里不起作用。
  • 我有点困惑。两个 UserControl 的名称是什么? SideBarTopWelcome 位于其中的什么位置?通常,我们使用 Panel 或 PanelHolder 代替带有 runat=server 的 Div 标签。
【解决方案3】:

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

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

当我应该这样做时:

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

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签