2009-11-19 33 views
10

Ist es möglich, Klassenbibliotheken zu erstellen, die UserControls enthalten, damit ich sie wiederverwenden kann? Wenn das so ist, wie? Ist das Markup mit der DLL kompiliert? Danke für jede Hilfe!ASP.NET UserControl-Klassenbibliothek

+0

@Mike C. ein Update zu meiner Antwort hinzugefügt, überprüfen Sie es. – eglasius

Antwort

6

Update: Ich war direkt auf meinem Hinweis auf die vorkompilierte Steuer Benutzer mit, wie Sie eine Benutzersteuerung würde.

Für einen Schritt für Schritt, wie Sie finden Turning an .ascx User Control into a Redistributable Custom Control

Es gibt keine Notwendigkeit für irgendein.Ascx-Dateien in dem Projekt, in dem Sie es verwenden werden, so entspricht dies genau dem, was Sie gesucht haben.


User Controls sind nicht über die Standorte hinweg wiederverwendet werden soll, statt custom server controls verwenden.

Sie können die Serversteuerelemente mithilfe vorhandener Steuerelemente zusammenstellen und alles so einrichten, dass Sie über CSS formatieren können.

Wenn Sie immer noch für die Benutzersteuerung Ansatz gehen, versuchen Sie, was Bob in der Antwort erwähnt. Ich habe es nicht mit Benutzersteuerelementen getan, aber ich würde erwarten, in der Lage zu sein, die Ausgabe dieses Ansatzes zu verwenden, als würden Sie ein benutzerdefiniertes Serversteuerelement verwenden.

<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls"%> 
... 
<aspSample:WelcomeLabel Text="Hello" NameForAnonymousUser="Guest" 
    ID="WelcomeLabel1" runat="server" BackColor="Wheat" ForeColor="SaddleBrown" /> 

Ps. Wenn das nicht funktioniert, sagt Ihnen der Link, den er zur Verfügung gestellt hat, dass Sie die Ascx-Dateien trotzdem kopieren, so dass das nicht das ist, was Sie gesucht haben, wenn Sie nicht bei benutzerdefinierten Server-Steuerelementen bleiben.

+0

Natürlich können Sie ein Benutzersteuerelement über mehrere Seiten verwenden – CRice

+0

@ Boon oops, gemeint ist, über Standorte zu sagen - die die Frage des OP klar gewesen sind;) – eglasius

0

Sie werden wahrscheinlich lieber in Server Controls suchen. AFAIK Sie können Benutzersteuerelemente nicht in eine einzelne DLL kompilieren.

9

Sie können sowohl UserControl s als auch Page s in Klassenbibliotheken kompilieren, da dies letztendlich der Fall ist, nachdem Ihre Website just in time kompiliert wurde. Der Prozess ist ein wenig beteiligt, weil UserControl s und Page s nicht für die Verwendung in verschiedenen Anwendungen gedacht sind.

Von MSDN:

Die Usercontrol gibt Ihnen die Möglichkeit Kontrollen zu schaffen, die an mehreren Stellen innerhalb einer Anwendung oder Organisation

http://msdn.microsoft.com/en-us/library/system.windows.forms.usercontrol.aspx

Die bevorzugte Methode für die Kontrolle verwendet werden können, die über Anwendungen hinweg verwendet werden, wäre custom web server controls zu erstellen.

Wenn Sie wirklich obwohl mit UserControl s halten wollen, der grundlegende Prozess diese Funktionalität zu erhalten, wie folgt:

  1. neue web application project erstellen.
  2. Entwickeln Sie die wiederverwendbaren UserControl s.
  3. Veröffentlichen Sie die Site als nicht aktualisierbare * Site. (Deaktivieren Sie die Option Aktualisieren dieser Site zulassen)
  4. Kopieren Sie die kompilierte Bibliothek aus dem Verzeichnis bin und die Dateien ascx nach Bedarf von der veröffentlichten Website in die neue Website.

    • Die nicht aktualisierbare Option bringt das Markup in die Baugruppe. Dies ist ein wichtiger Schritt.

Ja, als Punkt Nummer vier Staaten, müssen Sie die ascx Dateien kopieren. Das Markup wird in der Klassenbibliothek enthalten sein und die ascx wird tatsächlich leer sein. Es gibt keine Möglichkeit, dies zu vermeiden (es sei denn, Sie verwenden custom web server controls), weil UserControl s zu Page s über ihre Dateinamen hinzugefügt werden.

All dies wird ausführlicher über auf MSDN dokumentiert,

http://msdn.microsoft.com/en-us/library/aa479564.aspx

+0

Ich habe die Schritte ausgeführt, habe aber Probleme beim Integrieren der Assembly in meine Site. Ich habe die Option "nicht aktualisierbar" festgelegt, und ich habe in meinem neuen Projekt auf die DLL-Datei verwiesen. Ich kann nicht herausfinden, wie ich es auf meiner Seite erklären soll. –

+0

Ist Jut mich, oder erfordert diese Methode noch, dass Sie die Markup-.ascx-Dateien bereitstellen? "1.Kopieren Sie die entsprechenden .aspx/.ascx-Dateien von der gebauten [...]" – Radu094

+0

Sie benötigen immer noch die physische Datei, aber sie werden leer sein. – Bob

0

Wenn wir über Web-Formulare sprechen, ist die Antwort nein. Das Markup (Inhalt der ASCX-Datei) wird nicht in die DLL kompiliert. Die ASP.NET-Engine erwartet, dass diese Datei zusammen mit der Webanwendung im Dateisystem gefunden wird. Daher ist es nicht möglich, eine DLL zu erstellen, die Sie einfach neu verteilen oder freigeben können.

Wenn Sie Steuerelemente erstellen möchten, die in Webanwendungen gemeinsam genutzt werden können, können Sie stattdessen benutzerdefinierte Steuerelemente erstellen, aber dann müssen Sie das HTML im .net-Code codieren (vorzugsweise mit den entsprechenden Klassen für die Aufgabe statt nur HTML in Text erstellen), die ziemlich hässlich werden können, wenn das Steuerelement groß ist.

Persönlich finde ich es ziemlich ärgerlich, dass es so ist.

Ich denke jedoch, dass, wenn Sie ASP.NET MVC verwenden, gibt es einige Möglichkeiten (abhängig von Ihrer View-Engine), aber ich habe nicht viel Erfahrung mit MVC.

+0

Die Antwort ist nicht nein, werfen Sie einen Blick auf meine Antwort. – Bob

+0

@Bob, Ihre Antwort bietet keine Klassenbibliothek (wie in einer DLL) mit eingebetteten Benutzersteuerelementen, sondern eine Reihe von DLLs und entsprechende Ascx-Dateien. Sie müssen diese Dateien weiterhin in der Ziel-Webanwendung platzieren, um die Steuerelemente verwenden zu können. Also ist die Antwort auf die Frage, wie sie formuliert wurde, nein. Ihre Antwort kann jedoch eine gute Alternative sein. – Pete

+0

Die Dateiinhalte werden in die DLL kompiliert. Sie benötigen die Ascx-Dateien als Platzhalter. Das Vorhandensein mehrerer DLLs hängt nur von der Struktur Ihres Projekts ab. Es gibt keinen Grund, warum es nicht zu einem kombiniert werden kann. – Bob

0

Es klingt wie benutzerdefinierte Serversteuerungen sind, was Sie suchen.

Wenn Ihre Steuerelemente eine Kombination aus anderen Serversteuerelementen sind (z. B. ein Textfeld und eine Schaltfläche für ein Datumssteuerelement), können Sie CompositeDataBoundControl und CompositeControl anzeigen. Dies sind praktische Möglichkeiten, mit solchen Dingen zu arbeiten.

Beachten Sie jedoch, dass es sehr leicht ist, durch die Art und Weise, wie die Seitenzyklus-/Viewstate-Rehydration funktioniert, verwirrt zu werden. Ich habe aufgrund von subtilen Missverständnissen, wie es funktionieren sollte, ziemlich viel Zeit verloren.

http://aspnetresources.com/blog/composite_databound_control.aspx

0

Sie können User Controls aus einer DLL dienen. Sie müssen nur einen benutzerdefinierten VirtualPathProvider erstellen, um die Steuerelemente zu laden. Dies ist im Wesentlichen was SharePoint tut. Hier

ist ein Artikel von Microsoft, die den Prozess erklärt:

http://support.microsoft.com/kb/910441

Sie können auch eine Suche nach 'VirtualPathProvider' tun.

In diesem Beispiel wird der Code aus einer Datenbank geladen, Sie können ihn jedoch ändern, um den Code aus der Assembly als eingebettete Ressource zu laden. Wir machen das in meiner Firma, um eine Masterseite über viele Sites und Appdomains zu teilen.

Ein Vorbehalt jedoch. Dies funktioniert nicht in einer Medium Trust-Umgebung. Wenn Sie also eine Bereitstellung in einer Shared Hosting-Umgebung planen, sollten Sie einen Test auf Ihrem Host durchführen, um zu sehen, ob dieser zuerst funktioniert.