Frage

Ich habe folgende Eigenschaft in meinem Modell Metadata-Klasse:

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

Aber wenn ich ModelState.IsValid nenne es gibt immer falsch, weil regex Validierung nicht. Ich habe das eingegebene Datum (2010.08.29) gegen neue regex gleiche Muster abgestimmt und sie paßt perfekt.

Was mache ich falsch?

War es hilfreich?

Lösung

Das ist, weil regex in Strings und nicht DateTime Eigenschaften gilt. Gibt der Benutzer eine ungültige Zeichenfolge, die nicht auf eine DateTime Instanz aus dem Modell analysiert werden kann Bindemittel eine allgemeine Fehlermeldung, bevor Sie RegexMuster ausführt hinzufügen.

Sie haben ein paar Möglichkeiten:

  1. Anpassen der Fehlermeldung in einer Ressourcendatei
  2. Schreiben Sie eine benutzerdefinierte Modell Binder
  3. Verwenden Sie eine String-Eigenschaft (Ich fühle mich schuldig dies für den Vorschlag: -))

Andere Tipps

Actualy gibt es eine andere Abhilfe für dieses. Sie können einfach eine Unterklasse der RegularExpressionAttribute

public class DateFormatValidatorAttribute : RegularExpressionAttribute {
    public DateFormatValidatorAttribute()
        : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
        {
            ErrorMessage = "Please enter date in mm/dd/yyyy format";
        }

        public override bool IsValid(object value) {
            return true;
        }
}

in Ihrem Global.asax.cs beim Start der Anwendung registrieren, um die RegulaererAusdruck addapter für die Client-seitige Validierung wie folgt:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(DateFormatValidatorAttribute), 
                typeof(RegularExpressionAttributeAdapter));

Jetzt erhalten Sie die Build-in MVC regelmäßigen exression Validator Client-Seite zu haben und die Datetime als Objekttyp halten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top