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>();
mógłbyś pisać kod gdzie wykonać operację sprawdzania poprawności, aby zobaczyć jak wracasz błędy w widoku? – Javier
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) –
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