Markus**: Templates in ASP.NET

Hallo Froum,

ich arbeite derweil an einer Art Framework für Webanwendungen.
Da möchte ich mittels abstrakter Klassen, gewissermaßen eine "Bauanleitung" für Webanwednungen erstellen. Dazu habe ich erstmal in Visual Studio eine "Projektmappe" (Solutuion) angelegt, in der ich 1) das Projekt mit abstrakten Klassen und ein paar Interfaces, sowie 2) ein "Testprojekt" zum Testen erstellt habe. Funktioniert auch alles soweit.
Mein Problem ist jetzt, dass ich auch gerne Controls oder ganze Site-Templates vorhalten würde, es aber irgendwie nicht hinbekomme, da ich zwar "MustInherit"-Klassen vorhalten kann, die die Logik enthalten, aber im Moment keine ahnung habe wie ich z.B. ein Control oder eine Masterseite zum "Erben" wiederverwendbar vorhalten kann.

Wenn ich versuche die Controls aus dem "abstrakten" Projekt in ein Unterprojekt einzubinden, bekomme ich die Fehlermeldung "Der virtuelle Pfad ... ist einer anderen Anwendung zugeordnet."
Wenn ich versuche das Ganze im Codebehind einzubinden, indem ich ein Objekt vom Control instanziere und dann mit Controls.Add hinzufüge, kommt zwar keine Fehlermeldung, allerdings wird das control offenbar auch nicht gerendert/angezeigt.

Hat irgendwer von Euch nen Vorschlag, wie ich das Lösen kann?

Gruß Markus**

  1. Hi,

    ach-herrjeh ...

    Ein Framework für Webanwendung und das OOP Konzept (.Net Feature) "Polymorphismus" haben nichts direkt miteinander zu tun. d.h. nur weil du ne abstrakte Klasse definierst, entsteht dadurch kein Site-Template.

    Allerdings würde eine Implementierung eines Baukastensystems für Webanwendungen ganz sicher dieses Konzept verwenden, es liegt ja auch dutzenden von Design Patterns zugrunde.

    In deiner Fragestellung sind auch noch einige Sachen unklar:

    • Was meinst du mit Site-Templates?
    • Was meinst du mit "vorhalten"?

    Dein "abstraktes" Projekt sollte eine .Net Klassenbibliothek sein, welche auch die richtigen .Net Framework Assemblies wie System.Web referenziert. Womit wir beim Stichwort "referenzieren" wären. Die Website Anwendung, welche dieses "abstrakte" Projekt verwenden soll, muss natürlich auch eine (Projekt- oder Assembly-) Referenz auf dieses "abstrakte" Projekt haben. Mit einfach Pfad angeben und funzt wird das nix.

    Setz dich vielleicht mal mit dem Konzept Webparts in Sharepoint auseinander. Ausserdem bietet ASP.Net sogenannte "MasterPages". Auch gibt es bereits Frameworks für ASP.Net. Konzeptionellere wie ASP.Net MVC oder praktischere wie DotNetNuke, Sharepoint usw.

    Oder anders formuliert: Wie viel weisst du denn überhaupt über ASP.Net. Das "HelloWorld" Beispielprojekt von Microsoft zähle ich nicht als Wissen.

    Ciao, Frank

    1. Hi,

      Hallo Frank,
      erstmal Danke für Deine ausführliche Antwort! Ich hatte in der Fragestellung schon darauf hingewiesen, dass es nicht wirklich ein "Framework" sein soll. Du hattest den Begriff "Baukastensystem für Webseiten" genutzt, der es ganz gut trifft.

      In deiner Fragestellung sind auch noch einige Sachen unklar:

      • Was meinst du mit Site-Templates?
      • Was meinst du mit "vorhalten"?

      Was ich damit meine: Als Beispiel brauche ich eine bestimmte Seite mit annähernd gleicher Funktionalität ständig wieder. Anstelle es in jedes Projekt zu kopieren, (copy paste) halte ich es für Sinnvoller, dieses aus der Basis abrufen zu können.

      Oder anders formuliert: Wie viel weisst du denn überhaupt über ASP.Net. Das "HelloWorld" Beispielprojekt von Microsoft zähle ich nicht als Wissen.

      Ich mache seit einer Weile eine Umschulung und muß im Betrieb VB.Net programmieren. Hin und wieder auch C#. Dabei gibt es auch etliche Berührungspunkte mit ASP.Net.
      Im Rahmen meiner Ausbildung sollte ich mich nun mit o.G. Fragestellung befassen und die Möglichkeit(en) der Realisierbarkeit abschätzen, da eben viele unserer "Webanwendungen" gleiche Strukturen aufweisen, aber dennoch (wohl aufgrund historischem wuchses) der Aspekt der "Wiederverwendbarkeit" vernachlässigt wurde.
      Soll heißen, alle Produkte ähneln sich (optisch), die zugrunde liegende Logik für viele der Steuerelemente wurde aber trotzdem immer wieder neu / anders / von anderen Entwicklern implementiert.

      Ciao, Frank

      Gruß, Markus

      1. Hallo,

        also ...

        bei gleichem Design und gleichem (fixer statischer) Inhalt:

        Eine Klassenbibliothek mit UserControls, die kannst du da grafisch à la WYSIWIG entwerfen, mit Platzierung und so weiter. Die Klassenbibliothek dann im Webanwendungs-Projekt referenzieren. Und in der Page_Load Methode in der CodeBehind Datei der ASP.Net Seite dann die Klasse des Controls instanzieren und der (this.)Controls Collection der ASP.Net Seite mit Add hinzufügen.

        bei gleichem Design aber dynamischen Inhalt (z.b. eine Seite soll eine Tabelle mit Überschrift anzeigen, aber was genau da steht ist abhängig von der Seite und/oder Parametern), dann empfiehlt sich das MVC Pattern. (Model-View-Controller).

        Dieses Konzept wird für dich bei deinem jetzigen Kenntnisstand zwar (vielleicht sogar über-) fordernd sein, aber es lohnt sich und bringt dich extrem voran.

        ASP.Net MVC 3

        Model - die Daten/Information, die anzuzeigen sind, kann z.b. eine Klasse sein, welche Daten aus der Datenbank abruft und über eine Public Property als DataSet ausgibt.
        View - ein Design Template, z.b. ein UserControl mit einem Label und einem Grid drauf
        Controller - die Instanz, welche die Daten aus dem Model in die View schreibt

        Die View ist für die Interaktion zwischen Benutzer und Controller gedacht, dort drin behandelst du Button Clicks, aber nur soweit, dass du sie in etwas umwandelst, was der Controller versteht (siehe z.b. Command Pattern), damit muss keines der 3 Teile den genauen Aufbau des anderen kennen, welche Methoden oder Properties genau vorhanden sind.

        Bei der Programmierung der Controller, Model und View Klassen, dort kannst du dann Konzepte wie Abstrakte Basisklassen, Interfaces, Dependency Injection und so weiter anwenden.

        Und ja im Grunde kann man die Klasse "Page" aus dem .Net Framework als Controller betrachten (allerdings as PageController). Hier noch ein Link dazu:

        Page Controller

        Ciao, Frank

        1. Hi Frank,

          das MVC habe ich mir bereits angesehen und finde es etwas Gewöhnungsbedürftig, aber genial. Das ging mir bei LINQ auch erst so, da konnte ich mich allerdings schnell reindenken.
          Zudem kann ich aus verschiedenen Gründen nicht .NET4.0 benutzen.

          Eine Klassenbibliothek mit UserControls, die kannst du da grafisch à la WYSIWIG entwerfen

          genau das wollte ich nicht, da ich die Control u.a. auch in der Toolbox des Visual Studio einbinden wollte. Eine Lösung dazu habe ich auch inzwischen. Man kann einfach "WebControls" erben und die Controls dann "manuell" Rendern. Was mir noch nicht ganz gelingen will, ist das einbinden anderer Controls in ein Custom Control. Zumindest dann, wenn ein ScriptManager nötig ist.
          Terminiert dann mit "The control with ID 'Cal1' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it."

          Ich danke Dir trotzdem für Deine ausführlichen Antworten!

          Viele Grüße,

          Markus