MVC2 Clientseitige Validierung für eine DateTime?

8

Welchen Ansatz empfehlen Sie zur Validierung einer DateTime auf der Client-Seite in MVC?

Nehmen wir an, ich habe ein Modell mit einer Eigenschaft namens DateOfBirth , das wie so ein DateTime ist.

%Vor%

Auf der View habe ich ein einfaches

%Vor%

Ich kann entweder die Microsoft MVC-Validierungen oder die jQuery-Validierungen verwenden. Wie bekomme ich die DateTime zur Überprüfung der Client-Seite?

Ich weiß, dass all das DataTypeAttribute keine Formatierungshinweise liefert und keine Validierung durchführt (es überlässt diesen Teil dem ModelBinder).

Grundsätzlich möchte ich das kopieren, was der ModelBinder tut, wenn er versucht, den gebuchten Wert in die DateOfBirth-Eigenschaft des Modells zu schreiben.

Was sind Ihre Empfehlungen?

    
Josh 14.08.2010, 21:41
quelle

4 Antworten

4

Wie oben vorgeschlagen, folgen Sie Phil Haacks Beitrag zu benutzerdefinierten Validierungen: Ссылка

So würde ich es machen:

  1. Fügen Sie eine "DateFormatAttribute" -Klasse hinzu, etwa so:
%Vor%
  1. Fügen Sie eine "DateFormatValidator" -Klasse hinzu, etwa so:
%Vor%
  1. Registrieren Sie die oben genannten Klassen irgendwo in Global.asax.cs:
%Vor%
  1. Fügen Sie eine Validierungsfunktion auf dem Client hinzu. Beachten Sie, dass dies implementiert werden muss, indem das Gebietsschema des Benutzers zugewiesen wird. Das Folgende ist eine niederländische (nl-NL, nl-BE) clientseitige Validierungsfunktion:
%Vor%

Das sollte die Dinge abdecken ...

    
maartenba 03.09.2010, 13:07
quelle
1

Josh,

Ihr Problem ist ein ziemlich häufiges Problem in MVC, das ist, dass der Modelbinder versucht, die eingegebenen Werte aus dem Formular in das Modell zu BINDEN. offensichtlich, wenn es nicht passt, erhalten Sie sofort einen Fehler.

Wie kann ich den Modelbinder dazu bringen, meine benutzerdefinierte Validierung zu verwenden? und meine Fehlermeldung zurückgeben?

Nun, lesen Sie zuerst und machen Sie die Dinge von Phil Haack geschrieben. dann haben Sie Ihre benutzerdefinierte Validierung.

das nächste ist. Verwenden Sie keine Integer und Datumswerte in Ihrem Modell! Wenn der Benutzer in einer Textbox eingeben kann, was er will, führt dies immer zu Problemen.

Was Sie tun sollten, ist, ein flatObject Ihres Objekts zu erstellen.

Ein flatObject ist ziemlich einfach. Es ist ein Objekt, eine genaue Kopie der Variablen im Inneren, nur die Zeichen inst und datetimes sind Strings (cos die immer im Modelbinder binden)

Beispiel:

%Vor%

die einzigen Ints, die ich habe, kommen aus den Dropdowns, weil diese nicht fehlschlagen, wenn der Wert in den Dropdown-Listen ints ist. Das Datum (Datum) ist eine Zeichenfolge. Ich mache die benutzerdefinierte Validierung für diese Zeichenfolge. Der Modellbinder bindet an dieses FlatNieuw-Objekt.

Meine Nieuw-Klasse hat genau die gleichen Namen wie die Felder dieser Klasse. Wenn Sie UpdateModel () verwenden, funktioniert dies immer noch. Wenn Sie einen neuen Eintrag erstellen, können Sie mit automapper dieses flatObject Ihrem normalen Objekt zuordnen.

Ich denke, das zusammen mit dem Blog von Phil Haack sollte Ihnen helfen, dies zu tun. Wenn Sie Fragen haben, zögern Sie nicht zu fragen.

    
Stefanvds 06.09.2010 08:13
quelle
0

Ich stehe vor dem gleichen Problem und kann keine Lösung finden. Ich kann nicht glauben, dass jeder auf dieses Problem nicht gestoßen ist. Ich benutzte das Modul jquery.maskedinput.js und es funktionierte großartig, aber als ich begann, die "[DataType (DataType.Date)]" -Dekoration mit "EditorFor" hinzuzufügen, wenn die Datetime-Eingabe eine Klasse von class="text-box einzelne Zeile". Das Hinzufügen dieser Klasse bricht den maskierten Eingang js auf. Es formatiert auch meine niedrigeren Daten als "2/3/1010", die dann meine JQuery-Maske von "99/99/9999" bläst.

    
Terrence 17.08.2010 19:38
quelle
0

nach meiner Erfahrung einige Male entweder MVC-Validierungen oder die jQuery-Validierungen ist ein Over-Kill für einige Projekte, die wir entwickeln. deshalb code / greife ich manchmal selbst kleine aus.

Lösung eins: Benutzerdefiniertes Plugin (Sie können es so ändern, wie es Ihnen passt)

%Vor%

auf Ihrer Sicht:

  1. füge class = 'date' zu deiner Eingabe hinzu Box
  2. rufe das Plugin auf %Code%

Lösung 2: Verwenden Sie Jquery UI Date Pick (die Lösung, die ich jetzt verwende)

%Vor%

Weitere Details zu Lösung 2: Ссылка

    
D.J 09.09.2010 05:16
quelle