2013-11-07 3 views
1

Я использую Ninject, MVC4, AutoMapper и FluentValidation, склеенные вместе.Validate not called in custom validator

Я написал валидатор для моей модели просмотра, и я написал многоразовый валидатор, который должен быть вызван в валидаторе модели просмотра.

Проблема заключается в том, что при отправке формы переопределение Validate не вызывается на валидаторе модели просмотра, поэтому повторительный валидатор также не вызывается, поэтому в конечном итоге ModelResult является допустимым ... (вызывая исключение при записи объекта в БД) ...

Странно, что когда я добавил RuleFor для одного из свойств, форма хорошо проверяется.

public class RequiredSourceViewModelValidator : AbstractValidator<RequiredSourceViewModel> 
    { 
     public RequiredSourceViewModelValidator() 
     { 
      Mapper.CreateMap<RequiredSourceViewModel, Source>(); 
     } 

     public override FluentValidation.Results.ValidationResult Validate(RequiredSourceViewModel requiredSourceViewModel) 
     { 
      var validator = new SourceValidator(); 

      var source = Mapper.Map<RequiredSourceViewModel, Source>(requiredSourceViewModel); 

      return validator.Validate(source); 
     } 
    } 


public class SourceValidator : AbstractValidator<Source> 
    { 
     public SourceValidator() 
     { 
      RuleFor(s => s.Name) 
       .NotEmpty() 
        .WithMessage("Naam mag niet leeg zijn.") 
       .Length(1, 100) 
        .WithMessage("Naam mag niet langer zijn dan 100 karakters."); 

      RuleFor(s => s.Url) 
       .NotEmpty() 
        .WithMessage("Url mag niet leeg zijn.") 
       .Must(BeAValidUrl) 
        .WithMessage("Url is niet geldig.") 
       .Length(1, 100) 
        .WithMessage("Url mag niet langer zijn dan 100 karakters."); 
     } 

     private bool BeAValidUrl(string url) 
     { 
      if (url == null) 
      { 
       return true; 
      } 

      var regex = new Regex(@"^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$"); 
      return regex.IsMatch(url); 
     } 
    } 

public class Source : IEntity 
    { 
     /// <summary> 
     /// Gets or sets the primary key of the source. 
     /// </summary> 
     public int Id { get; set; } 

     /// <summary> 
     /// Gets or sets the name of the source. 
     /// </summary> 
     public string Name { get; set; } 

     /// <summary> 
     /// Gets or sets the url of the source. 
     /// </summary> 
     public string Url { get; set; } 

     /// <summary> 
     /// Gets or sets the ordinal of the source. 
     /// </summary> 
     /// <value> 
     /// The ordinal of the source. 
     /// </value> 
     public int Ordinal { get; set; } 

     public int? GameId { get; set; } 
    } 

Что может быть неправильным здесь?

ответ

1

Вы нарушаете неправильную перегрузку. Вы должны переопределить метод проверки с подписью: public virtual ValidationResult Validate(ValidationContext<T> context) becuase этот метод будет вызываться во время проверки MVC:

public override ValidationResult Validate(
     ValidationContext<RequiredSourceViewModel> context) 
{ 
    var validator = new SourceValidator(); 

    var source = 
     Mapper.Map<RequiredSourceViewModel, Source>(context.InstanceToValidate); 

    return validator.Validate(source); 
} 

Другой перегрузки используется только если вы вручную вызвать проверки как validator.Validate(object).

+0

Это работает, спасибо большое! –