代码之家  ›  专栏  ›  技术社区  ›  Sam Schutte

ASP.NET数据源控件“没有命名容器”异常

  •  5
  • Sam Schutte  · 技术社区  · 15 年前

    我的代码中一直有这个例外,我想知道是否有人可以帮助我。

    我有一个转发器控件绑定到一个ObjectDatasource,转发器的itemTemplate包含一个用户控件(ascx)。此用户控件依次包含几个其他控件,主要是与ObjectDatasource关联的GridView。

    初次使用此设置中的控件时,一切工作正常-数据显示正常。但是,当我更改过滤器选项(在中继器外部下拉),然后重新绑定中继器时,我得到异常:

    对象数据源控件“expdatasource”没有命名容器。请确保在调用databind之前将该控件添加到该页。” 在system.web.ui.webcontrols.databoundControlHelper.findcontrol(控件,字符串controlID) … … 在System.Web.UI.WebControls.ObjectDatasource.LoadCompleteEventHandler(对象发送方,事件参数e)

    我不确定问题是什么-我在一些地方读到将数据源移出ascx控件可能会有所帮助-这没有任何作用。ObjectDataSource似乎结构正确,正如我所说,它第一次(仅)工作。

    我在堆栈跟踪中注意到,当ASP.NET在LoadComplete()发生后调用findcontrol()时,会发生这种异常。如果我单步执行我的代码,看起来好像我的所有代码都在这之前完成了执行,所以这都是“系统”代码。

    为什么ASP.NET无法在LoadComplete处理程序中找到此数据源控件?

    谢谢!

    其他注释:

    • 此错误每隔一次发生。因此,第一次正确加载数据时,第二次刷新失败,并出现此错误。再次点击“加载”,它就会工作(第三次)。

    • 在失败的时候,在ascx控件中似乎有两次调用“page_load”。所以模式是:

      1. 工作模式:
    • 页面加载到父页面
    • 页面加载到ascx
    • 数据加载精细

      1. 故障模式:
    • 页面加载到父页面
    • 页面加载到ascx
    • 页面加载到ascx
    • 例外

    这一切都发生在对“repeater.databind()”的调用中,但它的行为会因是否已绑定而有所不同(显然)。

    更多注意事项:

    真正奇怪的行为。我从ObjectDataSource的底部删除了SelectParameters列表,突然间,页面不会因为没有NamingContainer而拒绝ObjectDataSource。当然,如果没有这些参数,数据绑定将无法实际工作……我可以将它们添加到代码中,但为什么这很重要?

    4 回复  |  直到 13 年前
        1
  •  3
  •   Sam Schutte    15 年前

    找到了一个奇怪的解决方案,我会发布,我们可以讨论一下,也许可以弄清楚为什么要修复它。

    在我的页面上,我有以下结构(稍微解释一下标签):

    下拉过滤器

    中继器

    用户控件X

    数据源控件

    引用下拉过滤器的控制参数

    结束对象数据源

    最终用户控件X

    终端中继器

    结束页

    如您所见,repeater itemtemplate中有用户控件,而该控件又具有带有controlParameters的“有罪”对象数据源。这些控件参数在引用的父页上具有DropDownList筛选器的名称(因此,基本上,如果将此控件添加到任何其他页,则如果找不到具有正确名称的控件,则会失败)。

    所以当我把所有的控制参数都改为参数时(删除了对DropDownList控件的引用),现在我不再得到这个错误。

    我所能假定的是,这个数据源引用了父页上的控件,这意味着它在返回到DataBind()上页的控件集时遇到问题。你可能会认为它会第一次失败,如果它会失败,所以这仍然是一个谜。

    有什么想法吗?

        2
  •  2
  •   Sunil Kumar    14 年前

    这是ASP.NET DataControls中的一个异常错误。我也遇到了类似的问题,在这个奇怪的错误之后损失了几个月,但最终得到了解决方案。原因是;要在itemtemplate中显示项,我们应该使用layouttemplate中的服务器控件作为itemtemplate的占位符。例如,我们可以在布局模板中使用带有id属性的table/div控件。在运行时,此占位符控件将替换为项模板的内容,“命名容器错误”将消失。 最后,如果在itemtemplate中有一个objectDatasource,请确保在布局模板中添加了具有“id”属性的somthing(如table/div)。

    谢谢, 太阳神。

        3
  •  1
  •   Bryan    15 年前

    雷把钉子敲在头上。你肯定错过了一个“如果”!ispostback)“某处。如何将用户控件添加到中继器?它是动态的吗?你说它在项目模板中,所以可能不是…但是多次调用page_Load意味着控件的多个副本。

        4
  •  1
  •   Tim Cooper    13 年前

    使用两个数据绑定。例子:

    SqlDataSource1.DataBind();
    ListView1.DataBind();