2009-07-16 19 views
0

Ich habe Probleme beim Hinzufügen von Prüfmethoden zu ein paar Kontrollen in meiner MVC-App. Ich folgendes verwenden für die mm/tt/Format zu testen:asp.NET MVC Modell Status Validierung Probleme

if (!Regex.IsMatch(candidateToEdit.availability.StartDate.ToShortDateString(), @"giantregex")) 
      ModelState.AddModelError("availability_StartDate", "Start date must be in the mm/dd/yyyy format."); 
//giantregex is a giant regular expression omitted for clarity 

Aus meiner Sicht habe ich:

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 

<%= Html.ValidationMessage("availability_StartDate", "*")%> 

Aus welchem ​​Grund der Fehlertext nicht angezeigt wird, es erkennt es Ein Fehler und der Start der Liste wird generiert, aber das "Startdatum muss im Format MM/TT/JJJJ sein." wird nicht angezeigt. Es wird validiert, wenn Sie das Datum korrekt eingeben.

+0

Erfolgt die Validierung innerhalb einer Teilansicht (alias UserControl)? Ich hatte dieses Problem aber nur zur Validierung für Eingaben in Teilansichten. – cfeduke

+0

Nein, es ist eine normale Ansicht. –

+0

Was passiert, wenn der Benutzer ein Datum wie 2/31/2009 eingibt? Sie können ein Datum nicht mit einer Regex validieren. – Paco

Antwort

3

Ich denke, das Problem hier ist, dass Sie einen tatsächlichen DateTime-Typ gegen einen regulären Ausdruck testen. Da sie ein ungültiges Datumsformat in das Textfeld eingegeben haben, wird sie niemals in ein tatsächliches DateTime geparst, in dem ToShortDateString() aufgerufen werden könnte. Daher findet Ihre Validierung für reguläre Ausdrücke nicht wirklich statt.

Sie müssen das ViewModel-Muster übernehmen, bei dem Sie alle potenziellen Analyseprobleme als Zeichenfolgen zuerst offen legen (z. B. "candidateToEditViewModel.AvailabilityStartDateString") oder die clientseitige Validierung implementieren und defensiv programmieren.

+0

Das macht Sinn, es sieht so aus, als wenn das ungültige Datum gepostet wird, es wird jedoch auf einen Standardwert initialisiert, was, wenn das der Fall ist, der reguläre Ausdruck sollte True zurückgeben, was es nicht tut. –

+0

Ich denke, was Sie sehen, ist die eingebaute Validierung, weil Sie (ich nehme an) eine DateTime und nicht eine DateTime deklariert? Also ist die Immobilie eigentlich * erforderlich *. – cfeduke

+0

So konnte ich ein bisschen schummeln, basierend auf der Logik, die ich brauche. Jedes Mal, wenn ein ungültiges Datum veröffentlicht wird, wird ein neues DateTime gerade initialisiert, also überprüfe ich einfach, ob der StartDate-Wert gleich dem initialisierten Wert von DateTime ist, und werfe den Fehler aus, wenn es wahr ist. Markiert als Antwort da es mich direkt zur Fehlerbehebung führt. Vielen Dank. –

0

Ich glaube, Sie brauchen eine Validierung Zusammenfassung schließen die Nachricht

<%= Html.ValidationSummary() %> 

EDIT zu bekommen: „“ Versuchen Sie setzen ein statt ein "_" als Eigenschaftsnamen in der AddModelError Aufruf wie folgt aus:

Statt:

ModelState.AddModelError("availability_StartDate", "Start date must be..."); 

try this:

ModelState.AddModelError("availability.StartDate", "Start date must be..."); 
+0

Der <% = Html.ValidationSummary()%> ist vorhanden. Ich werde meinen ursprünglichen Beitrag bearbeiten, um das zu klären. –

+0

Ändern von einem _ zu einem. scheint keinen Unterschied zu machen, das ist seltsam. Es funktioniert mit allen anderen Nachrichten gut. –

+0

Ja Breakpointing in meinem Code zeigt. verwendet für Modellfehlerschlüssel anstelle von _ (obwohl ich xval verwende, aber ich bin ziemlich sicher, dass die Operation die gleiche bleibt). – cfeduke

0

Die Probe gab man Arbeiten an meinem Testproject . Können Sie versuchen, den Fehler in einem neu erstellten Projekt zu reproduzieren?

Verwandte Themen