2016-08-24 19 views
6

Używam Fluent Validation w formularzu. Gdy kliknę przycisk Prześlij i nie wprowadzono nic, pojawia się błąd sprawdzania poprawności daty urodzenia. Jeśli wprowadzę DoB, wtedy otrzymam walidację dla Imienia.Fluent Validation nie sprawdza poprawności całego formularza po raz pierwszy

Dlaczego tak się dzieje? Nie mogę rozgryźć, co źle zrobiłem.

Moja forma:

@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken() 
     @Html.HiddenFor(customer => customer.CustomerIncomeInfo.CustomerEmploymentInfoModel.EmployerModel.Id) 

      <!-- basic customer info --> 
     <fieldset> 
      <legend>Customer Info</legend> 
      @Html.ValidationSummary(false, "Please correct the errors and try again", new { @class = "text-danger" }) 
      <div class="row"> 
       <div class="col-md-6"> 
        <dl class="dl-horizontal"> 
         <dt>@Html.LabelFor(model => model.FirstName)</dt> 
         <dd>@Html.EditorFor(model => model.FirstName, new {@class = "form-control"})</dd> 

        </dl> 
       </div> 
       <div class="col-md-6"> 
        <dl class="dl-horizontal"> 
         <dt>@Html.LabelFor(model => model.DateOfBirth)</dt> 
         <dd>@Html.EditorFor(model => model.DateOfBirth, new {@class = "form-control"})</dd> 

        </dl> 
       </div> 
      </div> 
     </fieldset> 
} 

My Zaawansowany Kod weryfikacyjny:

public CustomerValidator() 
     { 
      RuleFor(customer => customer.FirstName) 
       .Length(3, 50) 
       .NotEmpty() 
       .WithMessage("Please enter a valid first name"); 

      RuleFor(customer => customer.DateOfBirth).NotEmpty().WithMessage("Please enter a valid date of birth"); 


     } 

Moja Model:

public class CustomerModel 
    { 
     public CustomerModel() 
     { 
     } 

     public Guid Id { get; set; } 
     [DisplayName("First Name")] 
     public string FirstName { get; set; } 
     [DisplayName("D.O.B.")] 
     public DateTime DateOfBirth { get; set; } 
} 

Rejestrowanie walidator z Autofac:

builder.RegisterType<CustomerValidator>() 
       .Keyed<IValidator>(typeof(IValidator<CustomerModel>)) 
       .As<IValidator>(); 
+0

mógłbyś pisać kod gdzie wykonać operację sprawdzania poprawności, aby zobaczyć jak wracasz błędy w widoku? – Javier

+0

Kiedy masz pusty DoB, otrzymujesz komunikat "Podaj poprawną datę urodzenia" lub inny? Sądzę, że w tym przypadku nawet nie przechodzisz sprawdzania poprawności przez FluentValidation (ponieważ w mvc istnieje również poprawność poprawnego typu danych: i próbujesz przekazać wartość pustą do niemożliwego do zniesienia DateTime .To samo, jeśli napiszesz "a" w pole tekstowe związane z typem int) –

+0

Raphaël Althaus, masz rację! Sprawienie, że DoB nullable poprawi mój problem! Jeśli możesz opublikować aktualną odpowiedź (najlepiej z niektórymi szczegółami dotyczącymi kolejności sprawdzania poprawności), nagroda jest Twoja :) – RJP

Odpowiedz

1

Jestem również za pomocą Fluent Validation w moim projekcie w moim projekcie to działa w ten sam sposób, jak jesteś required.I próbowali swój kod tak samo jak mojego kodu to działa poprawnie patrz poniżej kodu:

/// Test CODE 
/// Model Class 
[Validator(typeof (CustomerModelValidator))] 
public class CustomerModel { 
    public CustomerModel() {} 
    public Guid Id { 
     get; 
     set; 
    } 
    [DisplayName("First Name")] 
    public string FirstName { 
     get; 
     set; 
    } 
    [DisplayName("D.O.B.")] 
    public DateTime DateOfBirth { 
     get; 
     set; 
    } 
} 
// Validator Class 
public class CustomerModelValidator: AbstractValidator <CustomerModel> { 
    public CustomerModelValidator() { 
     RuleFor(customer = > customer.FirstName) 
      .Length(3, 50) 
      .NotEmpty() 
      .WithMessage("Please enter a valid first name"); 
     RuleFor(customer = > customer.DateOfBirth).NotEmpty().WithMessage("Please enter a valid date of birth"); 
    } 
} 

Mam nadzieję, że ci to pomoże.

Powiązane problemy