ASP.NET DataSource-Steuerelement "nicht ein naming-container" Ausnahme

Ich habe immer diese Ausnahme in meinem code, und fragte mich, wenn jemand könnte mir helfen.

Habe ich ein Repeater-Steuerelement gebunden an ein ObjectDataSource, und die itemtemplate für die repeater enthält ein Benutzersteuerelement (ASCX). Das user control enthält wiederum mehrere andere Steuerelemente, vor allem eine GridView, die im Zusammenhang mit einer ObjectDataSource.

Auf die erstmalige Verwendung der Steuerelemente in diesem setup funktioniert alles Super - Daten korrekt dargestellt wird. Allerdings, wenn ich eine filter-option (dropdowns außerhalb des repeater), und binden Sie erneut Repeater, bekomme ich die exception:

Das ObjectDataSource-Steuerelement 'expDataSource' nicht haben ein naming-container. Sicherstellen, dass das Steuerelement Hinzugefügt wird, um die Seite vor dem Aufruf von DataBind."
System.Web.UI.WebControls.DataBoundControlHelper.FindControl(Control Control, String controlID)
...
...
System.Web.UI.WebControls.ObjectDataSource.LoadCompleteEventHandler(Object sender, EventArgs e)

Ich bin mir nicht sicher, was das problem ist - ich habe gelesen in ein paar Orte, die das verschieben der Datenquelle außerhalb der ASCX-Steuerelement kann helfen - dies tut nichts. Die objectdatasource zu sein scheint, richtig strukturiert, und wie ich schon sagte, es funktioniert das erste mal (nur).

Bemerkte ich in der stack trace der Ausnahme, dass dies Auftritt, wenn ASP.NET ruft FindControl() nach LoadComplete() Auftritt. Wenn ich Schritt durch meinen code, es scheint, als ob alle mein code ist beendet, bevor dies geschieht, so ist es alle "system" - code.

Warum würde ASP.NET nicht in der Lage zu finden, die das datasource-Steuerelement in der LoadComplete Handler?

Dank!

Sonstige Hinweise:

  • Dieser Fehler tritt auf, jede andere Zeit. So das sind erst mal die Daten richtig geladen wird, dann auf die zweite Aktualisierung schlägt fehl mit dieser Fehlermeldung. Klick auf "Load" wieder, es funktioniert (beim Dritten mal).

  • Auf dem mal, dass es nicht, wie es aussieht "Page_Load" wird zweimal genannt, in der ASCX-Steuerelement. Also die Muster sind:

    1. Muster Arbeiten:
  • Page_Load auf der Übergeordneten Seite
  • Page_Load auf ASCX
  • Daten Lädt feine

    1. Scheitern Muster:
  • Page_Load auf der Übergeordneten Seite
  • Page_Load auf ASCX
  • Page_Load auf ASCX
  • Ausnahme

Dies ist alles passiert aus einem Aufruf von "Repeater.DataBind()", aber es verhält sich anders, je nachdem, ob er bereits gebunden ist oder nicht (offensichtlich).

Weitere Hinweise:

Echt merkwürdig Verhalten. Ich entfernte die Liste der SelectParameters von der Unterseite des ObjectDataSource, und plötzlich die Seite nicht ablehnen, das ObjectDataSource-keine NamingContainer. Natürlich, ohne diese Parameter, Databinding nicht wirklich arbeiten...ich kann fügen Sie Sie in den code, aber warum sollte es eine Rolle?

  • Klingt wie Sie Ihre ersten erfolgreichen laden ist mit einem " GET " - Anforderung, und der Fehler tritt auf, in einer 'POST' - Sie sind mit einem 'if (IsPostBack)' Sache, die das laden steuert, oder die Daten anders?
  • Nein - beide Arten von Anforderungen sollte Sie den gleichen flow. Hmmm...
  • Ich denke, der erste laden ist ein POST tatsächlich auch, weil Sie wählen zunächst ein paar Optionen aus dem filter controls (Dropdown-Listen) vor dem klicken auf einen button "Load" für den ersten laden.
  • funktioniert es, wenn Sie schalten anzeigen, state off für den repeater?
  • Ja, wenn ich schalten Sie die ViewState-off für den repeater, der Fehler geht Weg. Problem ist, ich brauche ViewState zu werden, weil der temporäre Steuerelemente, die ich bin, indem (mindestens, ohne einige größere änderungen an dieser). Warum sollte drehen ViewState deaktivieren damit der Fehler weggeht?
  • View state wird verwendet, um zu rekonstruieren, wie die repeater-Steuerelemente auf die post zurück, wenn Sie haben itemcreated oder itemdatabound-Ereignis-Handler, die Sie verfolgen konnte, in Sie zu sehen, wenn es nicht auf Ihre Daten binden oder auf die Rekonstruktion (genannt von interner code), und dann zu sehen, warum der Fehler aufgetreten ist - wenn Sie nur gehen, um Sie zu verwerfen und neu erstellen des repeater, der view state ist eine Verschwendung - was machen Sie mit den temporären Kontrollen?
  • Ray - ich weiß nicht, verwerfen Sie die repeater-jedes mal. Dieser repeater ist innerhalb einer WARP-panel (AJAX-panel), und die Gitter innerhalb des repeater-Schaltflächen enthalten in Ihren Zellen, dass änderungen an der Startaufstellung. Zum Beispiel gibt es einen "Bearbeiten" - Taste, wenn darauf geklickt wird, ändert sich der Inhalt einer grid-Zelle zu einem Textfeld anstelle eines Etiketts. Wenn ich schalten Sie die ViewState, den Klick auf die Schaltfläche hinzufügen, macht den Inhalt der repeater verschwinden (weil es nicht beibehalten im ViewState, um wieder aufgebaut werden, nehme ich an). Mit der temporären Kontrollen, ich Speichere Sie in session-und re-hinzufügen. Also diejenigen, die möglicherweise nicht mit VS.
  • Die andere seltsame Sache, die ich bemerkt, das laden der Daten in dieser Weise arbeitet jeder anderen Zeit. So funktioniert es das erste mal, schlägt fehl, die zweite mit der Ausnahme, und arbeitet dann das Dritte mal, nicht, nicht den vierten. Wenn Sie den code schrittweise Durchlaufen, sehe ich auch ein komisches Muster mit dem Page_Load-events der enthaltenden Seite und der Kontrolle. Werde ich ausführlich über..
  • Also du machst ein "bearbeitbares Netz" Art-der-Sache? Tut mir Leid zu sagen, ich habe nicht viel Erfahrung mit dem, oder mit der ObjectDataSource. Es klingt wie Sie haben zwei verschiedene post wieder Situationen - ist ein ajax-post für die Bearbeitung und das speichern einzelner Elemente im raster, und die andere ist, wenn der Benutzer ändert den filter. In diesem zweiten Fall, den original-repeater Daten würden verworfen werden - richtig?
  • Richtig, im zweiten Fall, wenn ein filter geändert wird, werden die ganzen repeater wird verworfen. Das Problem kommt, weil bestimmte Aktionen innerhalb der repeater führen, müssen umgebaut werden, ohne den Filter ändern unbedingt. So wie es eine "Genehmigen" - button, der bedeutet, dass der genehmigte Gegenstand braucht, um die drop-out-of-repeater, weil es nicht mehr ist Un-Zugelassen. Ich rufe also "repeater.DataBind()" auf die entsprechende Schaltfläche klicken, und es werden alle Schläge mit, dass die Fehlermeldung statt des Wiederaufbaus. Auch, wenn ich Sie überschreiben die Seite.OnLoadComplete-Methode, auf der Arbeit Anrufe, repeater.Elemente, die gleich null ist, und 1 bei fail
  • Aha-glaube ich - nicht nennen DataBind-auf die ajax-Aufrufe (genehmigen, Bearbeiten, etc) - der repeater sollte sich wieder aufzubauen - natürlich, da ich nicht verwendet haben, einen repeater auf diese Weise, ich weiß nicht, ob das funktionieren wird...
  • Yeah - die DataBind-Methode aufgerufen, indem die Tasten, die innerhalb der Repeater ist definitiv, was das Problem verursacht, aber ich bin mir nicht sicher, wie Sie Sie sonst um den Repeater neu zu laden selbst. Wenn ich das nicht machen, die "Genehmigen" Taste Aufruf von DataBind () für eine Instanz, dann wird der AJAX-Bedienfeld blinkt und nichts neu geladen wird. Ich Frage mich, ob das Problem hat etwas mit der Tatsache zu tun, dass die Schaltfläche, ist die Auslösung der DataBind() Leben innerhalb des repeater....
  • vermutlich eine dumme Frage, aber bist du festlegen der DataSource-Eigenschaft jedes mal vor dem Aufruf von DataBind?
  • Ursprünglich war ich nur Einstellung DataSourceID in den code das erste mal. Der Wert blieb aufgefüllt, aber ich ging voran und versuchte nur eine Einstellung, die deklarativ in der ASPX-code, die warf den gleichen Fehler. Was nicht sinnvoll ist, auch wenn ich trennen Sie das ObjectDataSource-von allen Kontrollen (es ist nicht die Datenquelle für alles), wird dieser Fehler immer noch Auftritt. Und, es gibt 3 andere Objectdatasources in der Kontrolle, dass dies nicht ein problem für!
  • Mann, das ist verdammt seltsam. Wenn ich löschen <SelectParameters> Liste von der Unterseite des ObjectDataSource, dann habe ich nicht mehr diese Fehlermeldung erhalten, einfach durch die ObjectDataSource-live auf der Seite. Natürlich, die eigentliche databinding (die ich abgeschaltet, nur um die Dinge zu arbeiten) funktionieren nicht ohne diese Parameter Auswählen. Warum in der Welt würde unter Wählen Sie die Parameter aus machen und plötzlich anfangen, einen NamingContainer (in den Augen der ASP.NET)?
  • Sorry, Sam - ich bin aus Ideen heraus. Dies ist einer der Gründe, warum ich haven ' T verwendet diese asp.net bietet viel - die Einbauten sind ziemlich mysteriös, und es kann schwer sein, um die Gestalt, die diese Probleme aus. Ich hoffe, jemand anderes Glockenspiel in für Sie. Viel Glück.
  • Danke Ray, du bist auf jeden Fall Recht - die Interna kann den Schmerz und die sind sehr schemenhaft. Ich denke, das wäre einfacher gewesen, hätte ich es getan, in MVC...

InformationsquelleAutor Sam Schutte | 2009-11-16
Schreibe einen Kommentar