2016-08-24 2 views
6

J'utilise donc Fluent Validation sur un formulaire. Lorsque je clique sur Envoyer et que je n'ai rien entré, j'obtiens une erreur de validation pour Date de naissance. Si je saisis un DoB, j'obtiens la validation pour Prénom.Fluent Validation ne valide pas la totalité du formulaire la première fois

Pourquoi cela se produit-il? Je ne peux pas comprendre ce que j'ai mal câblé.

Ma forme:

@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> 
} 

Mon Courant Code de validation:

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"); 


     } 

Mon modèle:

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; } 
} 

Enregistrement du validateur avec Autofac:

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

Pouvez-vous poster le code où vous effectuez l'opération de validation pour voir comment vous retournez les erreurs à la vue? – Javier

+0

Lorsque vous avez un DoB vide, obtenez-vous le message "Veuillez entrer une date de naissance valide", ou un autre? J'imagine que vous ne passez pas par la validation par FluentValidation dans ce cas (car il y a aussi validation pour le type de données correct dans mvc: et vous essayez de passer une valeur null dans un DateTime non nullable, même si vous écrivez "a" dans une boîte de texte liée à un type int) –

+0

Raphaël Althaus, vous avez raison! Rendre le DoB nullable a résolu mon problème! Si vous pouvez poster une réponse réelle (et de préférence avec quelques détails pour l'ordre de validation) la prime est à vous :) – RJP

Répondre

1

J'utilise aussi Fluent Validation dans mon projet dans mon projet, il travaille de la même façon que vous êtes required.I ont essayé votre code même que mon code, il fonctionne très bien s'il vous plaît se référer ci-dessous le code:

/// 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"); 
    } 
} 

J'espère que cela vous aide.