it-swarm.com.de

Dynamisches Laden eines UserControls mit der LoadControl-Methode (Typ, Objekt [])

Ich versuche, die HTML-Darstellung eines Benutzer/Server-Steuerelements über eine Seitenmethode zurückzugeben. Es funktioniert, wenn ich die Überladung aufrufe, die den virtuellen Pfad zum Benutzersteuerelement nimmt, aber nicht, wenn ich versuche, die Überladung aufzurufen, die einen Typ annimmt. Der Beispielcode ist unten. Irgendwelche Vorschläge?

[WebMethod]
public static string LoadAlternates(string productId, string pnlId)
{
    object[] parameters = new object[] { pnlId, productId };
    return ControlAsString(typeof(PopupControl), parameters);
}

private static string ControlAsString(Type controlType, object[] parameters)
{
    Page page = new Page();
    UserControl controlToLoad;
    /*
     *calling load control with the type results in the 
     *stringwriter returning an empty string
    */

    controlToLoad = page.LoadControl(controlType, parameters) as UserControl;
    /*
     *However, calling LoadControl with the following overload
     *gives the correct result, ie the string rep. of the control.
    */
     controlToLoad = page.LoadControl(@"~/RepeaterSamples/PopupControl.ascx") as UserControl;

    //some more code, then this... 
    page.Controls.Add(controlToLoad);

    StringWriter sw = new StringWriter();
    HttpContext.Current.Server.Execute(page, sw, false);
    return sw.ToString();
}

Irgendwelche Ideen, warum dieser StringWriter eine leere Zeichenfolge zurückgeben würde? Ich sollte darauf hinweisen, dass der gesamte "Seiten" -Lebenszyklus unabhängig von der zum Aufrufen von LoadControl ausgewählten Methode korrekt ausgeführt wird.

Wollte hinzufügen - ich habe , um die LoadControl(Type, object[]) -Überladung zu verwenden. :-(

20
abjbhat

Auf der MSDN-Seite für LoadControl befindet sich dieser Kommentar unten:

Beschreibung
Eine Seite, die ein Benutzersteuerelement mit dem Page.LoadControl (Type, Object []) lädt, scheint keine in der ascx-Datei hinzugefügten untergeordneten Elemente zu erstellen. Die Verwendung von Page.LoadControl (String) funktioniert wie erwartet.

Bemerkungen
Vielen Dank, dass Sie dieses Problem gemeldet haben. Wir untersuchen und werden den Status aktualisieren, wenn wir weitere Informationen haben.

-Das Web Platform & Tools Team
Gepostet von Microsoft am 06.08.2005 um 11:08 Uhr
Dies ist beabsichtigt, da der Typ "TestUC" tatsächlich der von der Teilklasse verwendete Basistyp ist. Er enthält nicht den richtigen Code zum Instanzieren der TextBox1-Referenz, die tatsächlich im abgeleiteten Typ definiert ist. Es gibt zwei Problemumgehungen: 1. Verwenden Sie LoadControl ("TestControl.ascx"). In der Praxis verhält sich dies wie LoadControl (Typ), aber es instanziiert den abgeleiteten Typ, der weiß, wie TextBox1 instanziiert wird. 2. Verwenden Sie eine einzelne Dateiseite und fügen Sie der Seite die Anweisung <% @ Reference%> hinzu, um auf das Benutzersteuerelement zu verweisen, und weisen Sie der ascx-Seite einen Klassennamen zu. Dann ist es sicher LoadControl (Typ) zu verwenden

Vielen Dank, dass Sie das Problem gemeldet haben.
Webplattform- und Tools-Team. Gepostet von Microsoft am 14/06/2005, um 6:31 Uhr

25
lomaxx

Diese Überladung instanziiert die Basisklasse, instanziiert jedoch keines der Steuerelemente, sodass sie nicht funktioniert.

Ich habe einen kurzen Blog-Beitrag über eine Problemumgehung für die Übergabe von Parametern verfasst, wenn Sie interessiert sind.

6
Steven Robbins

Wenn Sie möchten, dass das Steuerelement vollständig gerendert wird, können Sie das Steuerelement instanziieren, wie Sie es jetzt mit LoadControl tun, und es dann vorübergehend der Steuerelementsammlung eines anderen Steuerelements oder der Seite selbst hinzufügen. Dadurch wird der Lebenszyklus für diese Steuerung initialisiert und alle richtigen Ereignisse werden ausgelöst. Sobald Sie dies getan haben, können Sie den gerenderten HTML-Code oder was auch immer Sie benötigen daraus erhalten.

Ja, dies ist ein Hack, aber es wird zur Not funktionieren.

0
Andrew Hare