ASP-MVC 2: Regulärer Ausdruck-Attribut arbeitet auf clientseitiger aber nicht serverside
[Required(ErrorMessage = "Date is required")]
[RegularExpression(@"^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$", ErrorMessage="Date is not valid must be like (dd/mm/jjjj)")]
public DateTime Startdate{ get; set;}
Die clientseitige Validierung funktioniert perfekt. So es scheint, dass JavaScript kann erfolgreich verstehen, meine regulären Ausdruck. Aber wenn ich einen postback, und den modelstate.Isvalid() aufgerufen wird.
Mein Datum nicht mehr gültig. Also ich vermute, dass, wenn .NET führt mit den passenden regEx-es passt nicht.
Meine Frage: Warum wird in diesem regulären Ausdruck entsprechen, die auf der client-Seite, aber nicht auf der server-Seite?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil, wenn Sie tun postback databinder geht erste, und es konnte nicht analysiert Wert auf DateTime.
Übrigens ist es nicht eine gute Idee, um RegularExpression-Attribut DateTime-Klasse. Es hat folgenden code
also Konvertieren.ToString(value, CultureInfo.CurrentCulture) werden nie mit Ihrer regex, denn es wird die Zeit haben, Teil zu.
Sollten Sie besser die Verwendung von String anstelle von datetime.
Ist es möglich, dass die client-seitige Validierung Regeln sind nicht tatsächlich angewendet? Haben Sie überprüft, dass das required-Attribut wie erwartet funktioniert? Sie sollten in der Lage sein zu verwenden firebug, um zu überprüfen, dass der reguläre Ausdruck ist das gleiche auf der server-Seite, alle Werte sind wie erwartet usw..
Auch - es könnte sein, dass der eingefügte Wert übergibt die regex, aber noch nicht umgewandelt werden kann in einen datetime-durch das Modell von binder - das wäre auch ein Modell produzieren Fehler.
Habe ich noch nicht überprüft Ihren regex zu sehen, was es wirklich tut, aber wenn Sie versuchen, um zu überprüfen, dass die Eingabe ein gültiges Datum ist, verwenden Sie die
DataTypeAttribute
statt.Ich denke, dass, wenn Sie überprüfen möchten, reguläre Ausdrücke, die Sie verwenden sollten:
konvertieren und dann Sie zu
DateTime
auf server-Seite nach dem Modell verbindlich. Sie wissen, dass Datum in bestimmten format, aber binder Modell ist nicht so schlau und wirft einen Fehler. Wenn SieDateTime
nach dem Modell der Bindung, es gibt keinen Sinn in der überprüfung anhand eines regulären Ausdrucks, nicht wahr? Modell-Bindung kommt zuerst und dann die Validierung.