Ich habe " In MVC sollte ein Modell die Validierung verarbeiten? " Gelesen, weil ich neugierig war, wohin die Validierungslogik auf einer MVC-Website gehen soll. Eine Zeile in der oberen Antwort lautet wie folgt: "Controller sollten die Validierung übernehmen, Modelle sollten die Verifizierung übernehmen."
Das hat mir gefallen, aber ich habe mich gefragt, warum wir aus mehreren Gründen keine Datenüberprüfung in der Ansicht durchführen würden:
- Ansichten bieten normalerweise eine robuste Validierungsunterstützung (JS-Bibliotheken, HTML5-Tags).
- Ansichten können lokal validiert werden, wodurch Netzwerk-E / A reduziert werden
- Die Benutzeroberfläche wurde bereits unter Berücksichtigung des Datentyps (Kalender für Daten, Spinner für Zahlen) entwickelt, sodass sie nur einen kleinen Schritt von der Validierung entfernt ist
Die Validierung an mehr als einem Ort widerspricht dem Konzept von MVC, Verantwortlichkeiten zu isolieren. Daher erscheint es unangemessen, dies in beiden Fällen zu tun. Ist die Datenvalidierung nur im Controller wirklich der dominierende Ansatz?
architecture
mvc
WannabeCoder
quelle
quelle
Antworten:
Ich glaube nicht, dass es einen einzigen Ort gibt, an dem man sagen kann, dass die gesamte Validierung stattfinden sollte. Dies liegt daran, dass auf einer standardmäßigen asp.net mvc-Website einige verschiedene konkurrierende Programmierstrategien zusammenarbeiten.
Erstens haben wir die Idee, die Domänenlogik in Modelle, die Aktionslogik in Controller und die Anzeige in eine Ansicht zu unterteilen. Dies basiert auf der Idee, dass die gesamte Logik auf dem Server stattfindet, wobei der Browser lediglich ein Rendering der Ansicht bereitstellt.
Anschließend erweitern wir die Ansicht mithilfe von clientseitigem Javascript. Dies ist heutzutage so weit fortgeschritten, dass die Idee einer "einseitigen Website" mit Jquery / Knockout / Angular gängige Praxis ist.
Diese Vorgehensweise kann dem Schreiben einer gesamten clientseitigen Anwendung entsprechen, die selbst ein MVC- oder MVVM-Muster implementiert. Wir verunglimpfen die Ansicht auf ein Datenübertragungsobjekt und den Controller auf einen Service-Endpunkt. Verschieben der gesamten Geschäfts- und Benutzeroberflächenlogik in den Client.
Dies kann zu einer besseren Benutzererfahrung führen, aber Sie müssen einem im Wesentlichen nicht vertrauenswürdigen Kunden vertrauen. Sie müssen also weiterhin eine Validierungslogik auf dem Server ausführen, unabhängig davon, wie gut Ihr Client seine Anforderungen vorab validiert.
Außerdem haben wir häufig Validierungsanforderungen, die vom Kunden nicht ausgeführt werden können. z.B. "Ist meine neue ID einzigartig?"
Jede Anwendung, die Sie mit dem Ziel erstellen, die beste Erfahrung / Leistung zu erzielen, leiht sich notwendigerweise mehrere Programmierparadigmen aus und macht Kompromisse, um ihr Ziel zu erreichen.
quelle
Könnten hier mehrere Validierungsverantwortlichkeiten berücksichtigt werden? Wie Sie in Ihrer # 3 gesagt haben:
Also vielleicht ist es:
Ansicht : Überprüfen Sie Eingabetyp, Format, Anforderung ... Grundlegende Validierung von Benutzereingaben, die nichts mit der Geschäftslogik zu tun hat. Fangen Sie all diese flauschigen Dinge ab, bevor wir Netzwerkverkehr generieren, indem Sie eine Anfrage an den Server stellen.
Modell : Überprüfen Sie die geschäftlichen Belange der Daten. Ist das ein rechtlicher Wert gemäß den Geschäftsregeln? Ja, es ist ein numerischer Wert (das haben wir in der Ansicht sichergestellt), aber macht es Sinn?
Nur ein Gedanke.
quelle
Ich gehe davon aus, dass Sie eine Validierung für die Persistenz benötigen.
Nicht nur Ansicht, sondern auch Modell sollte auch nicht validiert werden. Während meiner IT-Tage wurde mir klar, dass DDD eine der Möglichkeiten ist, um sicherzustellen, dass Sie die Dinge tatsächlich richtig machen, d. H. Klassen sind tatsächlich dafür verantwortlich, was sie sein sollten.
Wenn Sie dem domänengesteuerten Design folgen, enthalten Ihre Modelle Ihre Geschäftslogik, und das ist es. Aber sie beinhalten keine Validierung, warum nicht?
Nehmen wir an, Sie sind bereits so weit, wie Sie verwenden,
Data Mapper
anstattActive Record
Ihre Domain-Schicht beizubehalten. Sie möchten jedoch, dass Modelle validiert werden, und fügen die Validierung Ihrem Modell hinzu.Die Validierungslogik stellt sicher, dass Sie das Modell korrekt in Ihre MySQL-Datenbank einfügen können ... Nach einigen Monaten möchten Sie Ihre Modelle auch in noSQL-Datenbanken speichern, in denen andere Validierungsregeln als in MySQL erforderlich sind.
Sie haben jedoch ein Problem, Sie haben nur eine Validierungsmethode, müssen diese jedoch auf
Model
zwei verschiedene Arten validieren .Die Modelle sollten das tun, wofür sie verantwortlich sind , sie sollten sich um Ihre Geschäftslogik kümmern und es gut machen. Die Validierung ist an die Persistenz gebunden, nicht an die Geschäftslogik. Daher gehört die Validierung nicht zu einem Modell .
Sie sollten
Validator
stattdessen s erstellen , das ein Modell zur Validierung in seinem Konstruktor als Parameter verwendet, dieValidation
Schnittstelle implementiert und dieseValidator
s zur Validierung Ihrer Objekte verwendet.Wenn Sie zu einem späteren Zeitpunkt entscheiden, dass Sie eine weitere Validierungsmethode für eine andere Persistenzschicht hinzufügen möchten (weil Sie entschieden haben, dass Redis und MySQL nicht mehr der richtige Weg sind), erstellen Sie einfach eine andere
Validator
und verwenden IhrenIoC
Container, um die richtige Instanz zu erhalten auf deineconfig
.quelle
Für viele Entwickler sind Fat-Modelle gegen dumme hässliche Controller die bevorzugte Methode.
Grundkonzept im Text ist
und
Die Ansicht sollte sich nur mit dem Generieren und Präsentieren einer Benutzeroberfläche befassen, damit Benutzer die Absicht mit dem Modell kommunizieren können. Dies ist der wichtige Teil. Ein Modell sollte die gespeicherten Daten definieren, daher muss es auch für die Überprüfung der Gültigkeit der Daten verantwortlich sein.
Bei der Aufnahme einer Person muss jede Person eine vom Land angegebene eindeutige ID-Nummer haben. Diese Überprüfung erfolgt (im Allgemeinen) durch die
UNIQUE
Schlüsselprüfung durch die Datenbank. Jede gegebene ID-Nummer sollte einige Kontrollschritte erfüllen (die Summe der ungeraden Ziffern sollte gleich der Summe der geraden Ziffern usw. sein). Diese Art von Kontrollen sollte von der durchgeführt werdenModel
Der Controller sammelt Daten von
Model
und leitet sie anView
die Benutzerdaten weiter oder leitet sie an diese weiter und leitetView
sie weiterModel
. Eine Einschränkung des Zugriffs auf die Daten und ihrer Validierung sollte nicht von derController
. Es warController
derjenige, der die Cookie-Daten sammelt undModel
der prüft, ob es sich um eine gültige Sitzung handelt oder ob der Benutzer Zugriff auf diesen Teil der Anwendung hat.View
ist die Benutzeroberfläche, die Daten vom Benutzer sammelt oder dem Benutzer präsentiert. Einfache Überprüfungen können durchgeführt werden, indem derView
Benutzer die E-Mail-Adresse eingibt oder nicht (dies kann auch in der Ansicht erfolgen). IMO.View ist die Clientseite, und Sie sollten die Benutzereingaben nicht verschieben. Javascripts können möglicherweise nicht auf der Clientseite ausgeführt werden. Ein Benutzer kann handschriftliche Skripte verwenden, um sie zu ändern oder das Skript mithilfe des Browsers zu deaktivieren. Sie können clientseitige Validierungsskripte festlegen, aber niemals sollten Sie sie verschieben und die Ebene wirklich überprüfen
Model
.quelle
Simple checks can be done by the View like the user input e-mail address or not
vielleicht ist es nicht so klar. Aber was Sie gesagt haben, gilt auch für mich. Einfache und einfache Überprüfungen können in der Ansicht problemlos durchgeführt werden.Ansichten sollten Validierungen für ff-Zwecke durchführen:
quelle