Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

Wer kennt sie nicht... die zauberhaften ajax Kekse.

Doch was steckt dahinter?

In diesem Beitrag werde ich anhand eines Beispiels erklären, wie man ein jQuery Plugin dafür erstellen kann.

Die Vorgehensweiße:
Über einen clientseitigen Funktionsaufruf werden wir den Inhalt eines HTML Containers mit dem eines klassischen ASP.NET Controls ersetzen.
Das alles passiert mit einem Webservice Aufruf per jQuery der den HTML Code zurückliefert.

Schritt 1: Das Plugin

Eine kurze Einführung in jQuery Plugins.
In jQuery werden Objekte mit $.fn.<Name> = function() {} erweitert.
Allerdings sollte der "$" Alias vermieden werden, da Konflikte mit anderen Javascript Bibliotheken(bspw. prototype.js) entstehen können.
Die am häufigsten benutzte Vorgehensweise sieht so aus:

(function($){
    // --- Plugin kommt hier
})(jQuery);


Das neue Plugin nennt sich ascxLoder. Als Parameter die Pfadangabe und eine Sammlung mit Einstellungen.
Natürlich werden auch Standard Werte benötigt, damit ewige Parameter Übergaben vermieden werden.

$.fn.ascxLoader = function( path, params ) {
    var defaults = {
        showLoadingScreen = true
    };
    var config = $.extend(defaults, params);
    // --- Mit $(this) können wir auf den Container zugreifen.
    // --- über config.<Value> die gewünschte Einstellung.
}


Der Aufruf erfolgt dann über:

$("#MyContainer").ascxLoader("~/Control.ascx", { showLoadingScreen: false });

Schritt 2: Der Webservice Aufruf

Damit das Plugin jetzt auch den gewünschten Effekt bringt, bauen wir einen einfachen Webservice Request ein.

(function($){
$.fn.ascxLoader = function( path, params ) {
    var defaults = {
        path: "Control.ascx",
        showLoadingScreen: true
    };   
    var config = $.extend(defaults, params);
    var obj = $(this);
    path = path || config.path;
    // --- der Webservice Aufruf mit Pfad übergabe:
    $.ajax({
        type        : "POST",
        url         : "Webservices.asmx/GetControl",
        data        : '{"Path":"' + path + '"}',
        contentType : "application/json; charset=utf-8",
        dataType    : "json",
        success     : function( result ) {
            // result.d enthält den HTML code für unseren Container
            obj.html( result.d );
        }
    });
}
})(jQuery);


Hinweis: "path = path || config.path" bedeutet: falls path undefined ist, nimm config.path

Schritt 3: Der Webservice

Nun zum Webservice, der uns das gewünschte Control als HTML code zurückgibt.

<WebMethod()> _
Public Function GetControl( Path As String ) As String
Dim page        As New Page()
Dim userControl As UserControl = Page.LoadControl( Path )
Dim output      As New System.IO.StringWriter()
    page.Controls.Add( userControl )
    HttpContext.Current.Server.Execute( page, output, false )      
    return output.ToString()
End Function


Über folgenden Funktionsaufruf lässt sich das Control neu laden.

   $("Container").ascxLoader("~/Controls/Control.ascx");

War doch gar nicht so schwierig oder?

Anbei gibt es ein Beispiel zum selber ausprobieren.
Dieses beinhaltet neben dem eben gezeigten Beispiel auch die Möglichkeit, einer Anforderungen Parameter mitzugeben und so je nach Aufruf ein geändertes Control zurückzugeben.

Update:
Eine gelungene und erweiterte Version des Plugins, von Kristof Zerbe findet sich hier!



Veröffentlicht Mittwoch, 2. September 2009 23:25 von Roberto
Attachment(s): DemoJQueryPlugin.zip

Kommentare

# re: jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

das funktioniert aber nur soweit, wie Standardcontrols im UserControl zum Einsatz kommen. Problematischer wirds dann, wenn im UserControl AjaxToolkit-Elemente verbaut sind.

Samstag, 12. September 2009 20:37 by Rene Drescher-Hackel

# re: jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

Hallo Rene,

da hast Du Recht, allerdings denke ich, dass es nicht wirklich viel Sinn machen würde ein UserControl vom AjaxToolkit neu zu laden!

Montag, 14. September 2009 15:45 by Roberto

# re: jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

Hi Roberto,

vielen Dank für Deinen Artikel. Er hat mein kleines Projekt an dem ich gerade gearbeitet und über das ich auch geschrieben habe wirklich vorangebracht. Ich denke mal es wird Dich interessieren: http://bit.ly/1ktQcd.

Dienstag, 3. November 2009 21:36 by kristof

# re: jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

Hallo Kristof,

es freut mich wenn Dich mein Ansatz inspiriert hat - hab es als Update im Artikel notiert!

Finde die Erweiterung gut, vielen Dank!

Dienstag, 3. November 2009 22:17 by Roberto

# re: jQuery Plugin selbstgemacht - Dynamisches laden von ASP.NET Controls

Hallo Roberto,

hier noch mal ein kleines Beispiel zu deinem Blogpost, dass es mit Ajax.Pro gar nicht so schwer ist.

http://weblog.drescher-hackel.de/38D42556-AFF4-482B-AF53-8F6CD2D47ABE/Update+ohne+Panel+mit+AJAX.PRO.content.aspx

Sonntag, 22. November 2009 18:46 by Rene Drescher-Hackel
Anonyme Kommentare sind nicht zugelassen