【问题标题】:asp.net menu null exception errorasp.net 菜单空异常错误
【发布时间】:2017-05-10 02:28:41
【问题描述】:

我正在使用 asp.net 和一个嵌套母版页,我注意到一些非常奇怪的东西。在我的默认页面后面的代码中,我试图通过引用菜单的 ID 来访问我的菜单。但是,每次我这样做时,它似乎都是空的,向我抛出一个空异常错误,即使我在 html 文件中使用不同的菜单项填充了它。在使用母版页之前,我可以通过这种方式访问​​菜单项。

现在我可以通过添加以下行来规避这个问题 page.Master.FindControl("Menu0"); 在我的每个循环之前。在这一行之后,我的菜单似乎不为空。

   protected void Page_PreInit()//run when the page is loaded
    {
        Debug.WriteLine("website started");// website started

   Page.Master.FindControl("Menu0");


    foreach (MenuItem item in Menu0.Items)
    {
        string temp = item.Text;
        item.Text = "<span class=\"menuItems\">" + temp + "</span>";//assign correct style

    }

}  

我不知道为什么 progam 显示我的菜单为空,或者为什么这个特定的行可以解决问题 请多多帮助,谢谢

【问题讨论】:

  • 是母版页中的菜单吗?
  • 你不需要FindControl,像MasterPage master = this.Master;那样触摸MasterPage就够了,原因众所周知。在 Page_PreInit 事件中,控件为空(尚未创建),但达到 Master 属性会强制创建当前模板中的所有控件。详情看这里weblogs.asp.net/ysolodkyy/master-page-and-preinit
  • 好的,这似乎也有效,但为什么呢?为什么在我声明此引用之前我的菜单为空?
  • 好的,我会调查的

标签: c# html asp.net master-pages


【解决方案1】:

MasterPage 是一个命名容器。 FindControl 方法不会穿透命名容器。什么?这是什么意思?

如果你把一个控件放在一个命名容器中,母版页就是一个命名容器,那么这个容器内的控件的名字就以命名容器的id作为前缀,然后加上控件的id。因此,如果命名控件的 id 是 Xxx,那么命名容器中的菜单是 'XxxYyy',其中 Yyy 是菜单的名称。

当你调用Page.FindControl时,它会找到主命名容器Xxx,但它不会搜索命名容器内的控件,因此它返回null。

如果您有一个 GridView 并且需要在 GridView 中找到一个控件,则同样的想法也适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2017-10-10
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多