Ich erstelle ein Benutzersteuerelement, das sowohl innere Eigenschaften als auch normale Attribute haben soll. Obwohl die eigentliche Funktion des Steuerelements nichts mit UpdatePanel zu tun hat, versuche ich etwas mit ähnlichem ASPX-Markup zu erstellen. Der Entwickler, der die Seite gestaltet, sollte mein Steuerelement wie folgt verwenden können:
%Vor% Es wäre auch akzeptabel, die ControlEvent
-Tags in einem anderen Tag zu verpacken, ähnlich wie bei der Verwendung von UpdatePanel:
Aber das ControlEvents
-Tag sollte nur dieses eine bestimmte Tag erlauben, kein normales Server-Markup oder irgendetwas.
Ich verstehe, wie man den Inhalt in ContentTemplate
rendern kann (in meinem Page_Init
verwende ich die Methode ITemplate.InstantiateIn(placeholderControl)
). Dieser Teil funktioniert gut. Wo ich Probleme habe, bekomme ich den ControlEvent
-Teil zur Arbeit. Ich kann die innere Eigenschaft im Code-Behind wie:
Dabei scheint ASP.NET zu verstehen, dass ich ein ControlEvents
-Tag haben möchte. Aber ich kann weder Eigenschaften, noch innere Eigenschaften oder Attribute erkennen. Wenn ich stattdessen den ersten Markup-Typ ausprobiere, erhalte ich einen Laufzeit-Parserfehler: "Die Eigenschaft 'ControlEvents' hat keine Eigenschaft namens 'ControlName'." Wenn ich den zweiten Markup-Typ versuche, erhalte ich zur Laufzeit einen NullReferenceException
als Parser-Fehler, wobei der Fehler in der <ns:ControlEvent>
-Zeile erzeugt wird.
Ich habe online nachgesehen, aber ich habe kein gutes Beispiel oder eine Erklärung gefunden, wie ich erreichen kann, was ich mit ControlEvent
oder ControlEvents
erreichen möchte. Was vermisse ich? Könnte mir hier jemand ein gutes Beispiel geben?
Danke!
Bearbeiten:
Es stellte sich heraus, dass ein Teil des Problems darauf zurückzuführen war, dass ich das Steuerelement auf der Seite registriert hatte, die es verwendete. Wenn ich benutze:
%Vor% Es hat den Anschein, dass das Steuerelement selbst im Markup erkannt wurde, aber ns:ControlEvent
nicht. Wenn ich die Register
zu:
es hat soweit funktioniert, das Steuerelement selbst zu verstehen (vorausgesetzt, dass runat="server"
in den ns:ControlEvent
-Tags enthalten war). Die untergeordneten Steuerelemente von MyControl wurden jedoch nicht instanziiert oder gerendert und Ereignisse des Steuerelements wie Page_Init
und Page_Load
wurden nicht ausgelöst.
Nachdem ich viel herumgespielt habe, habe ich herausgefunden, dass ich beide Register
Direktiven brauche. Dies scheint eine chaotische "Lösung" zu sein, und es löst nicht wirklich alles, da zumindest einige der Markups in meinem Steuerelement nicht gerendert werden, obwohl das Template-Steuerelement ( ContentTemplate
) zu funktionieren scheint wieder.
Welche Arten von Dingen könnte ich hier vermissen, die diese Kontrolle weniger unordentlich machen würden und die diese Steuerung tatsächlich alles richtig machen würde?
Die Eigenschaften müssen als Collection
und nicht als List
implemented sein; Ansonsten ist das Wichtigste, das Sie sich merken sollten, dass das übergeordnete Steuerelement das Attribut [ParseChildren(true)]
haben muss, damit dies funktioniert, andernfalls wird die Sammlung null
sein.
Das folgende (server-control) Beispiel funktioniert wie erwartet:
%Vor%HTH.
Tags und Links asp.net user-controls