2016-08-24 2 views
6

Так что я использую Fluent Validation на форме. Когда я нажимаю кнопку «Отправить» и ничего не вводит, я получаю ошибку проверки даты рождения. Если я вхожу в DoB, я получаю подтверждение для First Name.Fluent Validation не проверяет всю форму в первый раз

Почему это происходит? Я не могу понять, что я сделал неправильно.

Моя форма:

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

Мой свободный Код подтверждения:

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


     } 

Моя модель:

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

Регистрация валидатор с Autofac:

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

Не могли бы вы опубликовать код, в котором вы выполняете операцию Validate, чтобы увидеть, как вы возвращаете ошибки в представлении? – Javier

+0

Когда у вас есть пустой DoB, вы получаете сообщение «Пожалуйста, введите действительную дату рождения» или другую? Я бы предположил, что в этом случае вы даже не проверите проверку FluentValidation (потому что есть также проверка правильности типа данных в mvc: и вы пытаетесь передать нулевое значение в значение с нулевым значением DateTime. То же самое, если вы пишете «a» в текстовое поле, связанное с типом int) –

+0

Raphaël Althaus, вы в порядке! Приведение значения null в значение DoB исправило мою проблему! Если вы можете опубликовать фактический ответ (и желательно с некоторыми деталями для порядка проверки), то щедрость будет вашей :) – RJP

ответ

1

Я также использую Fluent Validation в моем проекте в моем проекте он работает точно так же, как и вы required.I попробовали код такой же, как мой код он работает нормально, пожалуйста, смотрите ниже код:

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

Надеюсь, это поможет вам.