2015-12-31 12 views
5

Ho un problema con questo codice:FluentValidation quando non solleva alcun messaggio

RuleFor(field => field.TermEndDate) 
    .NotEmpty() 
    .When(x => x.TermEndDate == x.TermStartDate) 
    .WithMessage("error..."); 

ho impostato TermEndDate = DateTime.Now ma nessun messaggio solleva!

mio codice di prova è:

var now = DateTime.Now; 
var command = new AddTermCommand 
{ 
    SchoolId = Guid.NewGuid(), 
    TermStartDate = now, 
    TermEndDate = now 
}; 
var cmd = command.Validate(); 
if (!cmd.IsValid) 
    Console.WriteLine(cmd.Errors.First().ErrorMessage); 
+1

'DateTime.Now' prima' = '' DateTime.Now' ora!. –

+0

Che cosa stai cercando di fare? Puoi esprimere la regola di convalida che desideri avere in linguaggio naturale? La ragione per cui sto chiedendo è che il metodo 'When' è usato per limitare quando il validatore deve essere eseguito. Non specifica una regola di validazione. –

+0

Sto provando a usare 'Quando()' ma non funziona!? – CodeMan

risposta

3

Ci sono due problemi con il tuo codice:

Come ho notato nei commenti, il primo problema è che non si può davvero confrontare con DateTime.Now dal momento che chiamare DateTime.Now dopo un po 'di tempo (anche molto piccolo) ti dà un valore diverso.

Il secondo problema è che si sta utilizzando il metodo When. Il metodo When viene utilizzato per specificare una condizione per eseguire la convalida in primo luogo (ad esempio, è possibile specificare che si desidera convalidare questa proprietà solo se il valore di alcune altre proprietà è 1), non può essere utilizzato per specificare un regola di convalida. Invece è possibile utilizzare il metodo Must in questo modo:

RuleFor(field => field.TermEndDate) 
    .NotEmpty() 
    .Must(x => (DateTime.Now - x).Duration() > TimeSpan.FromMinutes(1)) 
    .WithMessage("error..."); 

Qui sto usando Must a dire che il valore di TermEndDate dovrebbe essere almeno 1 minuto più o meno (1 minuto dalla DateTime.Now) rispetto al momento in cui ho eseguire la convalida (che è quando invoco Validate).

UPDATE:

Per confrontare TermEndDate con TermStartDate, si può fare in questo modo:

RuleFor(field => field.TermEndDate) 
    .Must((cmd, enddate) => enddate != cmd.TermStartDate) 
    .WithMessage("error..."); 
+0

Grazie, 'Must' aumenta il messaggio error .. ma non posso confrontare 'TermEndDate' vs 'TermStartDate'! – CodeMan

+0

@ CodeMan, vedere il mio aggiornamento –

2

La regola sarà mai fuoco a causa TermEndDate sarà mai essere uguale a DateTime.Now; stai confrontando un valore del passato con un valore mobile di Now.

O provare la verifica contro una data specifica o semplicemente per il giorno:

RuleFor(field => field.TermEndDate) 
.NotEmpty() 
.When(x => x.TermEndDate.Date == DateTime.Today) 
.WithMessage("error..."); 
Problemi correlati