2 Stimmen

Ich kann nicht auf eine Instanz eines benutzerdefinierten geerbten Webcontrols von einer Code-Behind-Seite im Webanwendungsprojekt zugreifen

Ich habe von einem ASP.NET WebControl geerbt, um einige zusätzliche Funktionen hinzuzufügen. Ich habe mein Steuerelement in einer leeren ASP.NET-Website getestet (erstellt über Datei > Neue Website...) und es hat gut funktioniert. Aber ich kann es nicht zum Funktionieren bringen, wenn ich es zu einem Webanwendungsprojekt hinzufüge (erstellt über Datei > Neues Projekt... > Visual Basic > Web > ASP.NET-Webanwendung. Ich persönlich bevorzuge Websites, weil sie die Entwicklung vereinfachen, aber die Projektleitung, mit der ich jetzt zusammenarbeite, möchte, dass es eine Webanwendung bleibt (ihnen gefällt, dass der gesamte Seitencode in einer einzigen DLL im Bin-Ordner vorkompiliert wird).

Um das Problem einzugrenzen, habe ich versucht, das Problem mit dem einfachen MSDN-Durchführung: Entwickeln und Verwenden eines benutzerdefinierten Server-Steuerelements . Zu meiner Überraschung hatte ich dort das gleiche Problem: Wenn Sie es in einem ASP.NET-Webanwendungsprojekt erstellen und dann versuchen, auf die Instanz des Steuerelements aus dem Code-Behind der Seite zuzugreifen, erhalten Sie den Kompilierungsfehler BC30456: 'WelcomeLabel1' ist kein Mitglied von 'WebApplication1._Default'. Schreiben Sie z. B. in Page Load:

Me.WelcomeLabel1.Text = "foo"

Wenn Sie diese Codezeile jedoch einfach entfernen, wird die Seite korrekt kompiliert und der Browser zeigt die Seite mit der korrekt formatierten Bezeichnung an. Für mich ist dies ein Fehler im Compiler/Framework, denn wenn das Steuerelement richtig in die Seite injiziert wird, sollte es immer im Code-Behind verfügbar sein, richtig?

Irgendwelche Ideen? Ich nehme an, ich könnte meine Steuerung in eine Baugruppe kompilieren, wie weiter in der exemplarischen Vorgehensweise vorgeschlagen, aber das scheint wie Overkill.

Interessanterweise kann ich FindControl verwenden, um einen Verweis auf das WelcomeLabel zu erhalten, aber ich bin nicht in der Lage, es auf den entsprechenden Typ zu übertragen. Dies führt zu dem Fehler "Unable to cast object of type 'Samples.AspNet.VB.Controls.WelcomeLabel' to type 'WebApplication2.Samples.AspNet.VB.Controls.WelcomeLabel'." Ich habe jede Kombination von Namespaces und Importen ausprobiert, die mir einfiel, und sogar manuell Deklarationen zur Datei designer.vb hinzugefügt, aber ich kann das nicht zum Laufen bringen, es sei denn, ich wechsle zu einem Website-Projekt, was ich nicht kann.

UPDATE 1.1:

Um das klarzustellen: Was ich zu erreichen versuchte, war:

  1. Webanwendungsprojekt
  2. Vererbte Web-Control-Klassendatei in derselben Assembly (d. h. kein Verweis auf eine separate kompilierte DLL)
  3. Kontrolle, die der Seite durch Design-Time Markup hinzugefügt wird
  4. Instanz des Steuerelements, auf die im Code-Behind der Seite verwiesen wird

EDIT: Nachdem ich Bryans Kommentare erneut gelesen habe, habe ich es endlich verstanden. Es ist eigentlich sehr einfach: alles, was Sie tun müssen, ist hinzufügen Assembly="WebApplication1" zum %@Register% Richtlinie im Markup, und fügen Sie den Präfix "WebApplication1." zur Namespace-Direktive hinzu . Also:

<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>

Jetzt sollte es kein Problem mehr sein, das Steuerelement durch Markup zu instanziieren und von Code-Behind auf die Instanz zuzugreifen, egal ob Sie die Klassendatei des Steuerelements in App_Code oder an einem anderen Ort platzieren.

Jordanien Rieger

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X