Trennen der clientseitigen Logik von der serverseitigen Logik auf wiederverwendbare Weise mithilfe von MVC

8

Bevor Sie antworten, ist diese Frage kompliziert:

  1. Wir entwickeln in asp.net / asp.net mvc / jQuery, aber ich bin offen für Lösungen auf jeder Plattform mit jedem Framework
  2. Ich denke, Logik wie das Sortieren / Verstecken von Spalten / Neuanordnung von Spalten / Validierung (wo es sinnvoll ist) sollte auf der Clientseite sein
  3. Ich denke, Logik wie Suchen / Aktualisieren der db / running Workflows sollte auf der Serverseite sein (nur aus Gründen der Sicherheit / Debugging)

Was wir zu tun versuchen, ist NICHT MESSEN in unserer Benutzeroberfläche, indem wir eine Menge JavaScript schreiben, um mit der gleichen Funktion in verschiedenen Kontexten umzugehen. Ich verstehe, dass ich eine JavaScript-Datei + objektorientierten JavaScript verwenden kann, ich suche nach dem Muster, das alles einfacher macht.

Eine vorgeschlagene Lösung bestand darin, ein MVC-Modell sowohl auf der Client- als auch auf der Serverseite zu haben, wo wir JavaScript-Funktionalität in clientseitige Controller kapseln und sie dann in verschiedenen Teilen der Site verwenden können. Dies bedeutet jedoch, dass wir 2 MVC-Implementierungen haben!

Ist das ein Overkill? Wie würden Sie diese Lösung erweitern? Welche anderen Lösungen gibt es?

    
Zachary Yates 17.10.2008, 19:07
quelle

6 Antworten

2

Auf zwei; Sie sollten immer eine serverseitige Validierung sowie eine clientseitige Validierung haben

Auf drei; Wenn Sie einen Weg finden können, die DB auf der Client-Seite zu manipulieren, wäre das beeindruckend;)

Ich weiß nicht, wie ASP.net funktioniert, also spreche ich nur von meiner PHP-Erfahrung.

Ich würde Steuerelemente schreiben, die nach Server- und Client-Code gepaart sind. Jede Steuerung benötigt eine Form, eine clientseitige Logik und eine serverseitige Logik. Das Formular wird von Ihrer Templating-Engine geschrieben, die clientseitige Logik wird an das Formular angehängt und in JS geschrieben und die serverseitige Logik ist ein Controller- / Aktionspaar, das das Modell manipuliert. Natürlich möchten Sie Ihre clientseitige Logik nicht mit einer bestimmten Aktion / einem speziellen Controller verknüpfen. Stellen Sie also sicher, dass Sie eine Schnittstelle definieren, mit der Sie stattdessen mit Ihrem Steuerelement kommunizieren können ...

Dann würde ich für jedes Formular eine Klasse in Javascript schreiben, die Ihre Steuerelemente einbezieht. Beispielsweise; Sie können eine Kontrolle haben:

%Vor%

Das würde Ihr Formular ausdrucken. Dann in Ihrer Seiten-Controller-Klasse:

%Vor%

Jetzt können Sie "this.ListView1" verwenden, um die Listenansicht zu bearbeiten. Der Listenansicht-Controller macht Sachen wie AJAX-Abfragen für neue Seiten, wenn die Verwendung die nächste Seite-Taste drückt - und auch Spalten und Sortierung behandelt (die auch an den Server delegieren).

    
nlaq 17.10.2008, 19:22
quelle
3

Ich habe gerade gegoogelt, also nimm es mit einem Körnchen Salz. JavascriptMVC behauptet, ein MVC-Framework zu sein. Wieder habe ich keine Erfahrung damit, aber es könnte einen Blick wert sein.

    
David Robbins 18.10.2008 11:51
quelle
3

Halte es einfach. Erstellen Sie Ihre Anwendung so, dass sie im MVC ASP.Net-Framework voll funktionsfähig ist. In dieser Testphase ist kein JavaScript erforderlich.

Fügen Sie nun die schönen Dinge hinzu, indem Sie jQuery in Ihrem site.master (Google-Link) verknüpfen und unten in Ihren Views, die eine Web 2.0-Erfahrung erfordern, eine Verknüpfung zu geeigneten JS-Dateien herstellen, die die Funktionalität unauffällig hinzufügen. Schalten Sie JS aus und Ihre App wird zum vorherigen Schritt degradiert.

Sie möchten beispielsweise clientseitige Validierung zusätzlich zur serverseitigen hinzufügen. Die JS-Datei würde einen Ereignishandler an die Formulare anhängen. Der Handler würde dann ein Objekt verwenden, das vom Server generiert wurde (dasselbe Objekt, das für die Servervalidierung verwendet wird), das sich am besten als JSON-Objekt eignet, da es mit JS und ASP.NET kompatibel ist. Die Mitglieder des Objekts wären die Regeln, die überprüft werden müssen, und Fehlermeldungen, die in das DOM an der Stelle geschrieben werden, an der Sie sich für die serverseitigen Fehler entschieden haben. Ihr Handler gibt false zurück, bis alles korrekt und wahr ist.

Sie möchten eine nette, ausgefallene Funktion, z. B. eine Lightbox-Ansicht Ihrer Bilder. Fügen Sie ein Plugin für Ihre Ansicht hinzu, ändern Sie das Markup <ul id="lightup"> ..., fügen Sie den Code hinzu:

%Vor%

und dein Gut zu gehen.

Versuchen Sie, die freigegebene Funktionalität von Ihrem Server-Code in einen Web-Service oder eine Web-Seite zu trennen, damit sowohl der Client über XHR als auch der Server dieselben Funktionen / Daten nutzen können.

    
Willabee 11.03.2009 17:26
quelle
1

Wenn Sie MVC verwenden, nehme ich an, dass Ihre Ansicht eine Vorlagen-Engine verwendet. Jede Seite ist einer Vorlage zugeordnet, und jede Vorlage enthält normalerweise einen Verweis auf ein oder mehrere Skripts. Die Frage ist, wie werden Ihre Skripte in der Vorlage referenziert? Sind sie statisch oder dynamisch? Innerhalb Ihrer Controller sollten Sie die Möglichkeit haben, beliebige Skripts in die Ansicht einzufügen, die für eine Seite unabhängig von der Vorlage verwendet wird. Ich schlage oft diesen Ansatz vor, wenn es nötig ist, denn die MVC-Client-Simulation bedeutet genau das, was Sie gesagt haben - Sie haben jetzt zwei MVC-Frameworks zur Verfügung. Nicht nur das: Bei den meisten clientseitigen Modellen haben sie direkten Zugriff auf Ihr serverseitiges Modell, was den Zweck Ihrer serverseitigen MVC zunichtemacht. Sie umgehen jetzt den Controller vollständig.

Wenn es um JavaScript geht, ist es am besten, es sehr einfach zu halten. Mit jQuery haben Sie eine noch bessere Chance, dies zu erreichen. Jede Seite erhält den Kern, und Sie haben mehrere andere JavaScript-Dateien in demselben Ordner, wobei jeder ein Plug-in oder eine Erweiterung des jQuery-Objekts ist, das einer sehr spezifischen Funktionalität zugeordnet ist. Wenn Entwickler wissen möchten, ob bereits Funktionalität vorhanden ist, überprüfen Sie lediglich das Dateisystem, in dem sich die JavaScript-Dateien befinden. Wenn das Plug-in vorhanden ist, fügen Sie es zur Verwendung auf einer Seite in Ihren Controller ein. Auf diese Weise können Sie auf der Serverseite Helfer erstellen, die sich zwischen Ihrer clientseitigen App und allen vorhandenen Controllern befinden. Der Helper ist spezifisch für diese Funktionalität und dieses Plug-in, und Sie öffnen auf der Client-Seite keinen umfassenden Zugriff auf Ihre Modelle.

    
user4903 19.10.2008 22:57
quelle
1

gibt json / xml nicht an Ansichten zurück und erstellt sie nicht mit jquery dom generation auf dem Client. An ordentlichen Maschinen ist es ok, aber ich habe diesen Fehler gemacht und wenn ich versuche, die Seite mit meinem iPhone zu sehen, dauert es 60 Sekunden, um geladen zu werden ... und ich bin die einzige Person auf der Seite! : -)

an dieser Stelle verwende ich nur jquery dom injection für Ajaxy Updates und nicht die gesamte Seite rendern.

    
sam 11.08.2009 15:42
quelle
-1

... Es kommt darauf an ...

Eigentlich ist die beste Sache die Entwicklung der Benutzeroberfläche mit einem CSS / Javascript / HTML für eine Stil / Verhalten / Struktur + Daten, Menschen wollen in diesen Tagen Ajax-Interaktionen (Sie sehen überall coole Dinge, so dass sie erwarten, dass sie nicht jedes Mal ganze Seiten neu laden müssen), also denke ich, dass Sie das berücksichtigen sollten. BTW MVC endet, wenn dein Inhalt geliefert wird, und es muss nicht HTML-Inhalt sein, du kannst xml oder json in deiner Ansicht bereitstellen.

ASP.NET MVC erlaubt die Rückgabe von Inhalten ("TEXT"), damit Sie Ihr Backend mit MVC organisieren können und Benutzerinteraktion / Verhalten in Javascript, zum Beispiel wenn ein Ajax-Aufruf an den Server gesendet wird Sie rufen den Controller als Teil Ihrer Anwendung auf, so dass Sie eine Ajax-Aktion aufrufen können, die zu einem Ajax-Modell wechselt, das als JSON rendert und zum JS-Teil Ihrer Benutzeroberfläche zurückkehrt (der Verhaltensteil).

Da der Behavioral-Teil in Ihrem View-Teil definiert ist (Anfangsansicht besteht aus CSS / HTML JS), so lange es ein Präsentationsteil ist Ich denke, haben Sie die MVC-Muster nicht gebrochen.

PS. Ich habe vergessen zu sagen, dass offensichtlich DB-Aktionen in Ihrem Modell bleiben (Sie können beim Modell als den Ort denken, an dem die Datenzugriffsebene und die Business-Objekt-Ebene verbleiben)

    
kentaromiura 17.10.2008 19:24
quelle