2013-11-09 15 views
26

Ho questi due campi nel mio modello:mvc4 confrontare due date

[Required(ErrorMessage="The start date is required")] 
[Display(Name="Start Date")] 
[DisplayFormat(DataFormatString = "{0,d}")] 
public DateTime startDate { get; set; } 

[Required(ErrorMessage="The end date is required")] 
[Display(Name="End Date")] 
[DisplayFormat(DataFormatString = "{0,d}")] 
public DateTime endDate{ get; set; } 

Ho bisogno che endDate deve essere maggiore di startDate. Ho provato a utilizzare [Compare("startDate")] ma questo funziona solo per la stessa operazione.

Cosa devo usare per l'operazione "maggiore di"?

risposta

53

Dai un'occhiata a Fluent Validation o MVC Foolproof Validation: quelli possono aiutarti molto.

Con Foolproof, ad esempio, esiste un'annotazione [GreaterThan("StartDate")] di quella che è possibile utilizzare sulla proprietà della data.

Oppure, se non si vuole usare altre librerie, è possibile implementare il proprio convalida personalizzata implementando IValidatableObject del modello:

public class ViewModel: IValidatableObject 
{ 
    [Required] 
    public DateTime StartDate { get; set; } 
    [Required]  
    public DateTime EndDate { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (EndDate < StartDate) 
     { 
      yield return 
      new ValidationResult(errorMessage: "EndDate must be greater than StartDate", 
            memberNames: new[] { "EndDate" }); 
     } 
    } 
} 
+0

Questo non funzionerebbe sul lato client (JS), giusto? Riceverai questo messaggio solo su submit? – Davor

+0

@Davor Funzionerebbe anche sul lato client. –

+2

Poiché il tipo restituito è IEnumerable , facendo "yield return new ValidationResult ..." otterrebbe un risultato migliore. :) –

9

interfaccia IValidatableObject fornisce un modo per un oggetto da convalidare che implementa Metodo IValidatableObject.Validate (ValidationContext validationContext). Questo metodo restituisce sempre oggetto IEnumerable. Ecco perché è necessario creare un elenco di oggetti ValidationResult e gli errori vengono aggiunti a questo e restituiti. Lista vuota significa convalidare le tue condizioni. Questo è il seguente in mvc 4 ...

public class LibProject : IValidatableObject 
{ 
    [Required(ErrorMessage="Project name required")] 

    public string Project_name { get; set; } 
    [Required(ErrorMessage = "Job no required")] 
    public string Job_no { get; set; } 
    public string Client { get; set; } 
    [DataType(DataType.Date,ErrorMessage="Invalid Date")] 
    public DateTime ExpireDate { get; set; } 


    IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext) 
    { 
     List <ValidationResult> res =new List<ValidationResult>(); 
     if (ExpireDate < DateTime.Today) 
     { 
      ValidationResult mss=new ValidationResult("Expire date must be greater than or equal to Today"); 
      res.Add(mss); 

     } 
     return res; 
    } 
} 
+1

Questa soluzione è migliore della risposta scelta perché è necessario un elenco di risultati di convalida nel caso in cui si debbano confrontare più casi. Grazie. –