Laden...

Eigene Helper-Methoden schreiben MVC mit Zugriff auf Razor-Renderer

Erstellt von mosspower vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.193 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren
Eigene Helper-Methoden schreiben MVC mit Zugriff auf Razor-Renderer

Hallo,

ich mache mir gerade ein paar Gedanken, wie ich für einen Betrieb ein Webframework machen kann und u.a. stelle ich mir es so vor, dass man auf einer Administrationsseite für jede Seite Controls definieren kann und diese gleich mit Datenbankspalten verknüpfen kann, so dass man sich zentral um Internationalisierung, Berechtigung, Validierung, Binding usw. kümmern kann.

Da wir absolut keine klassischen Seiten machen möchten, also, wo der Browser den Response bekommt und nach einem Serverroundtrip die komplette Seite lädt, soll alles über AJAX laufen, so dass das Verhalten einer Desktopanwendung nachgeahmt wird.

Jetzt stellt sich mir die Frage, wie ich die Controls aufbaue. Ich könnte komplett auf *.aspx-Seiten verzichten und meine eigenen Tags ausparsen auf dem Server und HTML wegschreiben oder ich könnte es über sog. User-Controls lösen - diese müssten dann aber nested unterstützen, ist das der Fall, hat da jemand Erfahrungen.

Aufgrund der Firmenphilosophie muss es eine .NET-Anwendung sein, bzw. muss als Webserver dann auch der IIS laufen.

Ist sowas (also nested) in etwa möglich mit klassischem ASPX-Usercontrols?


<company:control key="xyz">
  <div>Hello World to english speakers!</div>
  <company:control key="123">
    <span>Hello Admin, you can see me!</span>
      <company:control key="AAA">
        <!-- will render <input type="text" data-validation value="Hey, Dude!" /> -->
        <!-- or framework tag usage <asp:TextBox></asp:TextBox> -->
      </company:control>
  </company:control>
</company:control>

Ggf. andere Ideen? Es war sehr, sehr viel Überzeugungsarbeit nötig, um überhaupt jQuery einsetzen zu dürfen - also weitere Libraries sollten nicht verwendet werden.

16.806 Beiträge seit 2008
vor 8 Jahren

Es war sehr, sehr viel Überzeugungsarbeit nötig, um überhaupt jQuery einsetzen zu dürfen - also weitere Libraries sollten nicht verwendet werden.

Sowas gehört zu den Aufgaben eines Entwicklers. Leider machen solche Vorgaben zu 99% Leute, die keine Ahnung haben.
Die muss man eben aufklären.

In modernen Technologien wie Angular nennt man sowas Direktiven und sind im HTML5 Standard enthaltren.
Du verwendest WebForms, was eben sehr sehr alt ist.
In MVC (Nachfolger von WebForms, aber auch nicht mehr die neueste Art) würde man das mit Partial Views abbilden.

In WebForms, was Du da zeigst, eben ein UserControl.
Statt klassisch würde ich es aber eher veraltet nennen 😃

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

@Abt,

naja, ich verwende die WebForms ja noch gar nicht, ich kenne sie nur, bzw. bin ich da "ausgestiegen" damals ...
Ich hab die letzten Jahre nur Desktopanwendungen gemacht oder Chrome/FF-Extensions programmiert. 😁

Letztendlich rendern doch alle Technologien HTML(5)-Code, wenn ich das richtig verstanden habe?

Ich hab mal kurz MVC angesehen und mir ist da bisschen anders geworden, weil ich es nie leiden konnte, wenn im Hintergrund Zeugs generiert wird, was man nur zu 5 Prozent benötigt. 😉 ... ich mag lieber "thin- and clean"-Sachen, wo man zur Not selber Hand anlegen kann.

Ich schau mir jetzt mal näher Angular an. Ist Angluar, wie jQuery, mitlerweile auch fester Bestandteil von ASP.NET, bzw. wird (offiziell von Microsoft) unterstützt?

16.806 Beiträge seit 2008
vor 8 Jahren

Wenn Du es klar haben willst, strukturiert und dann selbst Hand anlegen kannst, dann bist Du mit WebForms falsch bedient und mit MVC genau richtig.
Es nimmt Dir viel ab, aber Du kannst überall selbst einsteigen und eigenes Zeug einsetzen; das bietet WebForms eben gerade nicht.

WebForms hat einen RIESEN Overhead, der für moderne Anwendungen unfassbar ungeeignet ist.
Ich kenne auch nur noch Sharepoint, den einen Einsatz von WebForms berechtigt. Alles andere ist für mich entweder Inkompetenz, da man sich nicht weiterentwickelt hat, Legacy-behaftet oder einfach die falsche Technologie.

Angular hat mit ASP nichts am Hut; auch jQuery ist kein fester Bestandteil.
Das eine ist eine Servertechnologie, das andere eine Clienttechnologie.

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Naja, zur Not kann ich auch eine .ashx-Klasse machen als "zentralen Server-Controller", welche die angeforderten Seiten (HTML-Templates) lädt und an das Clientscript als AJAX-Response demenstprechend gerendert zurückliefert. 😁

Ne, mir ist schon klar, dass die JavaScript-Libraries keine Bestandteile von ASP.NET sind, aber ich glaube mal gelesen zu haben, dass Microsoft das aktiv (zumindest jQuery) supported und dann hat man doch schon mal ein gewichtiges Argument, wenn man es auch verwenden möchte in der Firma.

Ich werde mal die nächsten Tage mich einlesen in Angular und MVC und dann eine Lösung für mein Problem finden.
Wichtig wäre mir nur, dass man die Forumlarobjekte, welche man generieren muss, auch als Objekte auf dem Server ansprechen kann und nicht mittels (Regex) Parsing der HTML-Templates) sich das alles selber zusammenbauen muss. Ich stelle mir das (aktuell) so vor, dass man das HTML-Template lädt auf dem Server, und dann die Controls demenstprechend manipuliert, bzw. wegen Berechtigung, erst gar nicht anzeigt, und hier würde ich die Controls gerne als Objekte ansprechen, so wie es im "klassischen" ASPX mit Webforms auch möglich war. Dann wird die fertige Seite als Response dem AJAX-Aufruf zurückgegeben. JavaScript wäre dann auf dem Client nur dafür da, die benötigten Seiten zu laden und darzustellen und (Submit) Validierungen durchzuführen. Die Logik soll weiterhin auf dem Server stattfinden.

Dank dir erst einmal für die Hinweise! 👍

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Ich mach mal den Fred wieder auf. Ich habe mich jetzt eingelesen in MVC und das werde ich auch verwenden. Jetzt stellt sich mir weiterhin die Ausgangsfrage.

Ich würde gerne soviel wie möglich wegkapseln und bin mir noch nicht im klaren, wie ich das mit MVC umsetzen kann.

Wenn ich z.B. mittels MVC ein Textfeld darstellen möchte mit Label, würde ich auf der Template-Seite u.a. folgendes schreiben:

@Html.LabelFor(model => model.Name)
 @Html.EditorFor(model => model.Name)

... würde das jetzt noch in Verbindung mit Berechtigung, Mehrsprachigkeit und Zugriffssteuerung (Readonly ect.), müsste ich schon ein paar Abfragen mittels Razor drum rum basteln, was ich aber unbedingt vermeiden möchte.

Ich würde gerne eine globale ID vergeben, z.B. "LOG12NAME" in einer Administrationsmaske. Hier definiere ich das Mapping (Datenbank), Berechtigungen und Sprachsteuerung.

Ich würde dann gerne auf den jeweiligen .*html-Template-Seiten nur noch (mittels HTML-Helper?) in etwa so etwas stehen haben wollen:

@RenderFor("LOG12NAME")

Je nach Berechtigung, Sprachsteuerung und Zustand, wird dann das Tag mit dem Label gerendert.

Wie kann ich sowas angehen, bzw. umsetzen? Als Partial View eher nicht denke ich. Gibt es die Möglichkeit einen eigenen Helper zu basteln, der direkt eine Klasse aufruft - dort könnte ich dann die Abfragen machen. Dann stellt sich die Frage, ob ich im Quellcode an die "Code-Behind-Razor-Methoden" zum rendern von HTML-Tags komme, z.B. Html.LabelFor oder Html.EditorFor.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Die Anforderungen die du hier beschreibst entsprechen grob einem CMS, schau dir doch einfach mal ein paar C# Open Source CMS an und wie dort die Anforderungen umgesetzt wurden.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

709 Beiträge seit 2008
vor 8 Jahren

Hallo,
zur Umsetzung selbst kann ich nicht sagen, aber wie so ein Helper realisiert ist, kannst du z.B. hier nachsehen: LabelExtensions.cs

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Dank euch für die Hinweise.

Das "CMS-like" sollte kein Problem werden. Ich muss mir nur noch zusammensuchen, wie ich einen eigenen Helper programmieren kann und in diesem im Optimalfall die "Code-Behind-HTML-Tag-Generierungsmethoden" von Razor je nach Gebrauch aufrufen kann und das gerenderte HTML dann zurückgeben.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi mosspower,

warum verwendest du nicht PartialViews? Du kannst einer PartialView auch ein Model übergeben, und die View anhand dieses Models auswählen. Eine Helper-Methode zu schreiben, die Razor-Code ausgibt, halte ich jedenfalls für keine gute Lösung. Ich fänd es sogar eher kontraproduktiv, die Views in C# anstatt in Razor/HTML zu erstellen.

Christian

Weeks of programming can save you hours of planning

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Hallo,

ich möchte den Code aber nur ein einziges mal schreiben.
Nehmen wir an, ich habe eine globale ID "TEST123" festgelegt in der Administrationsmaske, dann möchte ich in der View eigentlich nur noch @RenderFor("TEST123") schreiben und in RenderFor passieren dann verschiedene Dinge, wie Berechtigungsprüfung, Laden Language für Label, bzw. Codes für IDS, welches Tag gerendert werden soll, und genau hier dann je nach Tag, z.B. INPUT, TYPE TEXT die jeweiligen Razor Rendermethoden aufrufen. Ich könnte auch für jedes Tag eine eiene View erstellen, aber dann hab ich mehrere Stellen zu pflegen, Name, class, Id usw.

Hinweis von MrSparkle vor 8 Jahren

Fullquote entfernt. Bitte beachte [Hinweis] Wie poste ich richtig?, Punkt 2.3

5.657 Beiträge seit 2006
vor 8 Jahren

Ich rate nocheinmal dringend davon ab, die die gesamte Anwendungslogik in einer Erweiterungsmethode unterzubringen. Für das Verarbeiten des Models, Abfragen der Zugriffsberechtigungen, Lokalisierung, Generierung der UI usw. gibt es unter ASP.NET MVC extra die Trennung von Model, Controller und View. Das gibt es auch nicht ohne Sinn, und alle deine Anforderungen lassen sich damit umsetzen (und vorallem vernünftig debuggen und testen).

Christian

PS: In diesem Zusammenhang wäre evtl. auch dieser Artikel interessant: [Artikel] Drei-Schichten-Architektur

Weeks of programming can save you hours of planning

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Das ist jetzt Philosophie. Für mich ist CRUD-Funktionalität (zum Darstellen, Mappen und Wegschreiben in Basisklasse mittels Serviceaufruf), Formatdarstellung, Sprachsteuerung und Berechtigungsprüfung immer das selbe und keine Logik und für mich jederzeit zentral auslagerbar. Nur darum geht es mir - das ist keine Logik für mich.

Das Model ist bei mir völlig in einem anderen (neutralen) Projekt mit Servicemethoden weggekapselt.