2015-12-31 18 views
5

Bu kod ile bir sorun var yükseltir vermez: Ben TermEndDate = DateTime.Now setFluentValidation değilken herhangi bir iletiyi

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

ancak hiçbir mesaj yükseltir!

Testim kodudur: TermEndDateDateTime.Now eşit olması asla çünkü

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' =' 'DateTime.Now'' önce şimdi!. –

+0

Ne yapmaya çalışıyorsun? Doğal dilde olmasını istediğiniz doğrulama kuralını ifade edebilir misiniz? Sormamın nedeni, validatorun ne zaman çalışması gerektiğini sınırlamak için 'When' yönteminin kullanılmasıdır. Bir doğrulama kuralı belirtmez. –

+0

'When()' kullanmaya çalışıyorum ama işe yaramıyor! – CodeMan

cevap

3

sizin koduyla iki sorun vardır:

Ben açıklamalarda belirtildiği gibi, ilk sorun olduğunu bunu yapamazsınız olduğunu DateTime.Now ile DateTime.Now numaralı telefonu arayarak bir süre sonra (hatta çok küçük) farklı bir değer verdikten sonra karşılaştırabilirsiniz. Bu sorun, When yöntemini kullanmanızdır. When yöntemi, ilk önce doğrulamayı çalıştırmak için bir koşul belirtmek için kullanılır (örneğin, bu özelliği yalnızca başka bir özelliğin değeri 1 olduğunda doğrulamak istediğinizi belirtebilirsiniz), belirtmek için kullanılamaz. doğrulama kuralı. Bunun yerine böyle Must yöntemi kullanabilirsiniz:

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

Ben ne zaman TermEndDate değeri zamandan daha en az 1 dakika veya daha az (uzak DateTime.Now itibaren 1 dakika) olması gerektiğini söylemek Must kullanıyorum Doğrulamayı çalıştır (Validate'u çağırdığımda).

GÜNCELLEME:

bunu şöyle yapabiliriz, TermStartDate ile TermEndDate karşılaştırmak için:

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

Teşekkür ederim, 'Must', mesaj hatasını artırıyor .. ama 'TermEndDate' ile 'TermStartDate' karşılaştırılamıyor! – CodeMan

+0

@CodeMan, güncellememe bakın –

2

Kuralınız yangın asla; Geçmişten bir değeri Now'un hareketli bir değeriyle karşılaştırıyorsunuz.

Ya belirli bir tarihte karşı veya sadece gün doğrulanırken deneyin:

RuleFor(field => field.TermEndDate) 
.NotEmpty() 
.When(x => x.TermEndDate.Date == DateTime.Today) 
.WithMessage("error..."); 
İlgili konular