我使用Ninject,MVC4,AutoMapper和FluentValidation粘合在一起。
我为我的视图模型编写了一个验证器,我编写了一个可重用的验证器,必须在视图模型验证器中调用。
问题在于,当我发布表单时,不会在视图模型验证器上调用Validate覆盖,因此也不会调用可重用的验证器,因此最终ModelResult有效...(导致异常时将实体写入DB)...
奇怪的是,当我为其中一个属性添加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; }
}
这里可能有什么问题?
答案 0 :(得分:2)
你正在压倒错误的重载。您需要使用签名覆盖Validate方法:public virtual ValidationResult Validate(ValidationContext<T> context)
因为在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)
等验证时才会使用其他重载。