2017-09-12 2 views
1

Ich habe das Review-Modell, ich versuche, das Modell zu validieren, so dass , wenn der Benutzer ein Datum auswählt, kann es nicht das Datum in der Zukunft sein.DataAnotation um ein Modell zu validieren, wie kann ich es validieren, so dass das Datum nicht in der Zukunft liegt?

Review.cs

public class Review : BaseEntity{ 

    [Key] 
    public int Id {get; set;} 

    [Required(ErrorMessage="You need a restaurant name!")] 
    public string RestaurantName {get; set;} 

    [What do I put in here??] 
    public DateTime Date {get; set;} 


} 

Ich bin ein Neuling, und die documentation ist ziemlich schwer zu verstehen.

Vielen Dank für Ihre Hilfe im Voraus.

+0

Bitte verlinken Sie auf die Dokumentation, die Sie nicht verstehen haben. – Trisped

+0

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation Ich weiß nicht, wie man die Datetime – Jung

+0

vergleicht Wenn Sie auch clientseitige Validierung möchten, verwenden Sie eine [idiotensicher] (http://foolproof.codeplex.com/) '[LessThan]' oder ähnliches Attribut oder implementieren Sie Ihre eigenen - [Die komplette Anleitung zur Validierung in ASP.NET MVC 3 - Teil 2] (https://www.devtrends.co .de/blog/the-complete-guide-zu-validierung-in-asp.net-mvc-3-teil-2) –

Antwort

3

Sie gelangen wieder eine benutzerdefinierte Validierung Attribut erstellen können, die Ihre eigene Logik hat und dass Ihr Eigenschaftsnamen verzieren.

public class DateLessThanOrEqualToToday : ValidationAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return "Date value should not be a future date"; 
    } 

    protected override ValidationResult IsValid(object objValue, 
                ValidationContext validationContext) 
    { 
     var dateValue = objValue as DateTime? ?? new DateTime(); 

     //alter this as needed. I am doing the date comparison if the value is not null 

     if (dateValue.Date > DateTime.Now.Date) 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
     return ValidationResult.Success; 
    } 
} 

Jetzt in Ihrem View-Modell, mit dieser neuen Gewohnheit Ihre Eigenschaftsnamen schmücken Attribut

[DateLessThanOrEqualToToday] 
public DateTime Date { get; set; } 

Dieses Attribut benutzerdefinierte Validierung primarly auf Ihre speziellen Validierungslogik konzentriert. Sie können es ändern, um mehr Null-Checks, Minimum-Wert-Check usw. nach Bedarf einzuschließen.

+0

Vielen Dank für die ausführliche Antwort. Mache ich diese Klasse in der Review.cs-Datei ?? – Jung

+0

Ich würde eine separate Klasse erstellen und sie zur besseren Lesbarkeit in einem Ordner wie "CustomValidations" aufbewahren – Shyju

0

Sie müssen dafür einen benutzerdefinierten Validator schreiben. Sie können es zum Beispiel wie gewünscht benennen.

[DateNotInTheFuture] 
public DateTime Date { get; set; } 

Prozess selbst in gutem Detail in diesem Artikel erläutert wird: https://msdn.microsoft.com/en-us/library/cc668224.aspx

Zusammengefasst:

  • public class Neues versiegelt, die Validation
  • Innerhalb dieser Klasse implementieren eine Überschreibung für IsValid erbt Methode.
  • Ihre benutzerdefinierte Validierungslogik innerhalb IsValid Methode schreiben und das Ergebnis
0

Versuchen Sie benutzerdefinierte Validierung oder Standardmodell Validierung mit Attributen.

Erste Option, Set-Attribut auf Eigenschaft Standard DataAnnotations Validierung:

  • Set Datetype Attribut mit Fehlernachricht Eigenschaften und dateformatstring.
  • Set Bereich Attribut, wenn Sie möchten.
  • Set Anzeige Attribut für Show-Label auf dem Bildschirm.

    [DataType(DataType.Date), ErrorMessage = "Please enter a correct date format dd/mm/yyyy hh:mm", DisplayFormat(DataFormatString="{0:dd/MM/yyyy}", ApplyFormatInEditMode=true)] 
    [Range(typeof(DateTime), "1/1/2016", "1/1/2011")] 
    [Display(Name = "My Date")] 
    public DateTime Date {get; set;} 
    

Zweite Option, Benutzerdefinierte Validierungsmethode:

Sie müssen die Validation Klasse erweitern und IsValid außer Kraft setzen:

public class MyDateValidation: ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // check your business date property 
     DateTime myDatetime; 
     bool isParsed = DateTime.TryParse((string)value, out myDatetime); 
     if(!isParsed) 
      return false; 
     return true; 
    } 
} 

[MyDateValidation(ErrorMessage="Your message")] 
public Datetime myDate { get; set; } 

Sehen Sie meine anderen answer über dieses Thema.

0

Um nur einen alternativen Ansatz zu bieten, könnten Sie IValidatableObject in Ihrer Review Klasse implementieren. Dies könnte beispielsweise sinnvoll sein, wenn Sie nicht an Wiederverwendung interessiert sind - andernfalls wäre @ Shyjus Antwort angemessener.

Hier ist ein Beispiel dafür, was IValidatableObject Umsetzung aussehen könnte:

public class Review : BaseEntity, IValidatableObject 
{ 
    ... 

    public DateTime Date { get; set; } 

    IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (Date > DateTime.Now) 
      yield return new ValidationResult("Your error message."); 
    }  
} 
Verwandte Themen