DateTime-Validierung funktioniert nicht, obwohl ein Feld mit identischem Code einwandfrei funktioniert (in C # MVC, ASP.Net Core)

9

Bearbeiten 1

Nur um ein paar Punkte zu klären,

  • Die datetime-Auswahl / das Skript scheint gut zu funktionieren, die Zeiten und Daten sind wählbar und füllen das Textfeld mit den korrekten Werten wie erwartet.
  • Das Problem tritt auf, wenn eine Uhrzeit / ein Datum manuell vom Benutzer in das Textfeld eingegeben wird und eine ungültige Uhrzeit eingegeben wird (z. B. "78/5/2017 12:00" oder "12/5/2017 12:62").
  • Ich habe einen Tippfehler im Code aktualisiert, der Fehler tritt immer noch mit dem korrigierten Code auf.

Ich habe die Daumen gedrückt. Ich vermisse etwas Offensichtliches, weil das für mich keinen Sinn ergibt. Jede Hilfe, die Sie anbieten können, wäre sehr willkommen. Ich habe meinen Code am Ende der Frage eingefügt.

Das Problem

  • Ich habe zwei DateTime -Felder, die in einem Formular auf einer Seite in meiner Anwendung enthalten sind: StartTime und EndTime .
  • Beide Felder werden eingerichtet und mit (was ich glaube) identischen Code auf die Seite gelegt.
  • Das StartTime -Feld funktioniert einwandfrei, nur mit gültigen Zeiten als Eingabe und Anzeige eines Fehlers für unsinnige Zeiten wie 28:30 oder 17:67, bis der Benutzer es korrigiert.
  • Das Feld EndTime wird jedoch nicht korrekt validiert. Schlechte Eingaben werden auf die aktuelle Uhrzeit / das aktuelle Datum zurückgesetzt, bevor sie an die Steuerung zurückgegeben werden. Die Steuerung sieht niemals die schlechten Werte, was bedeutet, dass ich sie nicht abfangen kann und an dieser Stelle einen Fehler zurückgebe.
  • Wenn in beiden Feldern unsinnige Werte angegeben werden, wird die Einreichung verhindert und beide Felder weisen einen Validierungsfehler auf, der darauf hinweist, dass die EndTime Validierung funktioniert, sie verhindert jedoch nicht die Formularübergabe.

Meine Bemühungen

Da ich ein Arbeitsfeld habe, habe ich versucht, den Fehler zu korrigieren. Ich stolperte jedoch, als mir klar wurde, dass es keine Unterschiede zwischen den beiden gibt. Da ich entschieden habe, dass ich etwas verpasst habe, habe ich die Namen der Variablen so geändert, dass StartTime den Code EndTime benutzt und umgekehrt, ich habe das in jedem der folgenden Abschnitte nacheinander getan, in der Hoffnung, einen Punkt zu finden, an dem der Feld, das funktionierte vertauscht. Das ist jedoch nie passiert. Selbst wenn die Gesamtheit ihres Codes umgestellt wurde, wurde immer noch die EndTime Variable / Feld gefunden, die unterbrochen wurde und die StartTime Variable / Feld, die funktionierte.

Meine Forschung

Obwohl ich fast eine Woche mit diesem Bug verbracht habe, konnte ich online keine ähnlichen Probleme mehr finden und stolperte darüber, wohin ich gehen oder was ich jetzt versuchen sollte. Ich habe versucht, nach Problemen zu suchen, die von DateTime-Kalenderauswahlprogrammen verursacht werden, sowie von Validierungsfehlern im Allgemeinen, aber ich kann nichts finden, was für diese Situation nützlich wäre.

Dies ist einer der letzten Bugs, die behoben werden müssen, bevor das Projekt abgeschlossen ist, und jede Hilfe oder sogar Ideen, die Sie anbieten können, wären erstaunlich.

Der Code

Ich habe hier alles eingefügt, was ich denken könnte, das mit den fraglichen Feldern interagiert. Wenn ich etwas verpasst habe oder weitere Informationen benötigst, lass es mich wissen.

Das Entitätsmodell

Ich habe die folgenden zwei DateTime Felder in meiner Record Entity

%Vor%

Der Vollständigkeit halber ist dies der Code der TimeNow() -Funktion:

%Vor%

Das Ansichtsmodell

Die Entität Record wird dann wie folgt in ein ViewModel eingefügt:

%Vor%

Das CSHTML-Formular

Sie werden dann wie folgt in ein Formular auf der Seite eingefügt:

%Vor%

Ein angehängtes Skript

Und dann haben sie endlich ein Skript auf sie angewendet, um die Verwendung einer Kalenderauswahl bei jeder Eingabe zu ermöglichen. Das Skript sieht so aus:

%Vor%     
Tom Eardley 16.05.2017, 11:31
quelle

1 Antwort

0

Vielleicht ist ein Vorschlag, die DateTime.TryParseExact-Methode zu verwenden, die die "String" -Darstellung des Datums mit dem gewünschten Format überprüft und einen Fehler zurückgibt, wenn die Zeichenfolge nicht dem angegebenen Format entspricht. Hier ist Code, beachten Sie dateFormats basieren auf australischen Standarddaten. Sie können natürlich Stunden und Minuten dazu hinzufügen.

Hinweis: parsedDate ist ein DateTime-Format. Verwendung von unten ist:

%Vor%

Und die Methodendeklaration. Verwenden Sie entweder in der statischen Klasse oder direkt in Ihrer Klasse.

%Vor%     
Arvin Amir 07.06.2017 00:15
quelle