簡體   English   中英

ASP.NET DataSource控件“沒有命名容器”異常

[英]ASP.NET DataSource Control “does not have a naming container” exception

我一直在我的代碼中得到這個例外,並想知道是否有人可以幫助我。

我有一個綁定到ObjectDataSource的Repeater控件,並且轉發器的itemtemplate包含一個用戶控件(ASCX)。 該用戶控件又包含幾個其他控件,主要是與ObjectDataSource關聯的GridView。

在此設置中初始使用控件時,一切都很有效 - 數據顯示正常。 但是,當我更改過濾器選項(轉發器外部的下拉菜單),然后重新綁定Repeater時,我得到異常:

ObjectDataSource控件'expDataSource'沒有命名容器。 確保在調用DataBind之前將控件添加到頁面中。“在System.Web.UI.Web.控件,控件控件,字符串控件ID中的System.Web.UI.WebControls.DataBoundControlHelper.FindControl(控件控件,字符串控件ID)......”...在System.Web.UI.WebControls.ObjectDataSource中。 LoadCompleteEventHandler(Object sender,EventArgs e)

我不確定問題是什么 - 我在一些地方讀過,將數據源移到ASCX控件之外可能會有所幫助 - 這沒什么用。 objectdatasource看起來結構合理,正如我所說,它是第一次(僅)。

我在堆棧跟蹤中注意到,當發生LoadComplete()之后ASP.NET正在調用FindControl()時發生這種情況。 如果我單步執行代碼,似乎所有代碼都在執行之前完成執行,因此它是所有“系統”代碼。

為什么ASP.NET無法在LoadComplete處理程序中找到此數據源控件?

謝謝!

其他說明:

  • 每隔一次都會發生此錯誤。 因此,第一次正確加載數據時,第二次刷新會因此錯誤而失敗。 再次單擊“加載”,它可以工作(第三次)。

  • 在它失敗的時候,看起來在ASCX控件中調用了兩次“Page_Load”。 所以模式是:

    1. 工作模式:
  • 父頁面上的Page_Load
  • ASCX上的Page_Load
  • 數據加載正常

    1. 失敗模式:
  • 父頁面上的Page_Load
  • ASCX上的Page_Load
  • ASCX上的Page_Load
  • 例外

這一切都發生在對“Repeater.DataBind()”的調用中,但它的行為會有所不同,具體取決於它是否已被綁定(顯然)。

更多說明:

真奇怪的行為。 我從ObjectDataSource的底部刪除了SelectParameters列表,突然之間,該頁面沒有拒絕ObjectDataSource,因為沒有NamingContainer。 當然,沒有這些參數,數據綁定實際上不會起作用......我可以在代碼中添加它們,但為什么它會重要?

找到一個奇怪的解決方案,我將發布,我們可以討論,也許找出為什么這個修復它。

在我的頁面上,我有以下結構(稍微解釋標簽):

DropDownFilter

中繼器

UserControl X.

ObjectDataSource控件

ControlParameters引用DropDownFilter

結束ObjectDataSource

最終用戶控件X.

結束中繼器

結束頁面

正如您所看到的,在Repeater中,ItemTemplate是用戶控件,而后者又擁有帶有ControlParameters的“有罪”ObjectDataSource。 這些控制參數在引用的父頁面上具有DropDownList過濾器的名稱(所以基本上,如果將此控件添加到任何其他頁面,如果找不到具有正確名稱的控件,它當然會失敗)。

因此,當我通過並將所有ControlParameters更改為Parameters(刪除對該DropDownList控件的引用)時,現在我不再收到錯誤。

我可以假設的是,這個數據源在父頁面上引用了一個控件這一事實意味着它很難被添加回DataBind()上的頁面控件集。 如果它根本失敗的話,你會認為它會第一次失敗,所以這仍然是一個謎。

有什么想法嗎?

這是ASP.NET DataControls中的一個特殊錯誤。 我有類似的問題,並在這個古怪的錯誤背后丟失了幾個月,但終於得到了解決方案。 原因是; 要在ItemTemplate中顯示項目,我們應該使用LayoutTemplate中的服務器控件作為ItemTemplate的占位符。 例如,我們可以在布局模板中使用帶有ID屬性的Table / Div控件。 在運行時,此占位符控件將替換為ItemTemplate的內容,“命名容器錯誤”將消失。 最后,如果你在ItemTemplate中有一個objectDataSource,請確保在布局模板中添加了帶有“Id”屬性的somthing(如table / Div)。

謝謝,蘇尼爾。

雷擊中了頭上的釘子。 你肯定錯過了“if(!IsPostBack)”某個地方。 如何將用戶控件添加到轉發器? 它是動態的嗎? 你說它在ItemTemplate中,所以可能不是......但是對Page_Load的多次調用意味着控件的多個副本。

同時使用DataBind。 例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM