Asp.NET MVC - Validieren Sie ein Modell außerhalb des Controllers

8

Ich baue ein ASP.NET MVC-Projekt und gehe für die folgende Architektur:

  • Ein Core Projekt mit Modellen, Validierung, DTO, Logik usw.
  • Ein ServiceStack-API -Projekt, das als meine REST-API
  • fungiert
  • Ein Projekt ASP.NET MVC Web , das die Benutzeroberfläche
  • darstellt

Sagen wir also, ich möchte einen Benutzer hinzufügen. Ich definiere ein NewUserInputModel im Core Projekt. Ich gebe ein paar Datenanmerkungen wie [Required] . Anschließend führt das Web -Projekt anhand dieser Anmerkungen eine clientseitige Validierung durch.

Meine Frage betrifft die serverseitige Validierung. Ich möchte die NewUserInputModel unter Verwendung der gleichen Regeln validieren, die auf der Client-Seite verwendet werden, und ich möchte diese Validierungswetterfunktion ausführen, bei der NewUserInputModel von der API oder der stammt Web Projekt.

Mir ist klar, dass ich ModelState.IsValid von einem Controller im Web -Projekt aufrufen könnte - aber ich möchte diese Validierung vom Core -Projekt aus aufrufen, damit alle Validierungslogik funktioniert in Kern . Auf diese Weise, egal wie dieses Modell in die Kern Logik kommt, rufe ich immer dieselbe Validierung an. Ich möchte keine System.Web -Referenz in mein Core -Projekt ausliefern.

Ist das ein vernünftiges Design? Ich denke, es ist - aber wenn etwas darüber riecht, würde ich mich freuen, es zu hören.

Vielen Dank im Voraus für jede Hilfe.

    
MattW 19.11.2013, 12:57
quelle

4 Antworten

3

Normalerweise halte ich meine Ansichtsmodelle im Webprojekt und führe die Eingabe Validierung im Controller mit der Eigenschaft ModelState durch. Wenn dies gelingt, ordne ich sie Domänenmodellen zu (die in der Core-Schicht leben) und sende diese an meine Dienste im Layer Service (könnte auch Core sein). Die Serviceebene validiert Geschäftsregeln und wenn dies erfolgreich ist, ruft sie ein Repository auf, um die gewünschte Aktion auszuführen, und gibt das Ergebnis der Operation an den Controller zurück.

Wenn Sie Ihre Ansichtsmodelle im Webprojekt beibehalten, können Sie auch MVC-Validierungsattribute wie RemoteAttribute .

Ich sage nicht, dass Ihr Design riecht , aber ich denke, es ist gut, die Präsentationslogik von Ihrer Core-Ebene zu trennen.

    
Henk Mollema 19.11.2013, 13:31
quelle
6

Ich halte Ihren Ansatz für gut. Das Zuordnen einer Gruppe von Modellen zu einer anderen könnte einige Fehler mit sich bringen.

Der Code, den Sie suchen, ist:

%Vor%

Details finden Sie in Ссылка oder Ссылка

    
qub1n 26.02.2014 19:41
quelle
0

Mein Ansatz dafür, schnell zu denken, ist, so etwas zu tun. Erstellen Sie in der Business-Schicht

%Vor%

Jetzt mit einem Service-Beispiel

%Vor%

Jetzt rufen Sie im Controller den Dienst auf und übergeben die Validierungsnachrichten an die Ansicht. Es kann notwendig sein, ViewBag zu verwenden und die gesamte Liste zu übergeben. In der Ansicht können Sie Info, Warnung, Fehler markieren. Zum Beispiel könnten Sie eine Erfolgsmeldung mit Info-Typ oder gar nichts zurückgeben und im Controller eine Erfolgsmeldung erstellen.

Im Allgemeinen ist dieser Ansatz mehr Codierung, aber mehr Flexibilität. Idealerweise würde der Dienst alles validieren, aber für kleinere Projekte, um doppelte Validierung zu vermeiden, wie Henk Mollema in seiner Antwort erklärte, könnten Sie die Benutzereingabe über ViewModel validieren und im Service einfach nur kritische Geschäftsregeln validieren.

ValidationMessageType kann auch ein Overkill sein, daher ist es möglich, nur List vom Service als Fehlerliste zurückzugeben, und die leere Liste würde Erfolg bedeuten.

    
Pawel Cioch 03.08.2015 14:53
quelle
0

Eine gemischte Validierung könnte auch nützlich sein, um DataAnnotations mit einer eigenen Validierungslogik zu mischen

Dies kann hilfreich sein Ссылка

    
Pawel Cioch 03.08.2015 15:02
quelle