C# 在自定义验证器中未调用验证

C# 在自定义验证器中未调用验证,c#,asp.net-mvc,fluentvalidation,C#,Asp.net Mvc,Fluentvalidation,我使用Ninject、MVC4、AutoMapper和FluentValidation粘在一起 我已经为我的视图模型编写了一个验证器,并且已经编写了一个必须在视图模型验证器中调用的可重用验证器 问题是,当我发布表单时,视图模型验证器上没有调用Validate覆盖,因此也没有调用可重用验证器,因此最终ModelResult是有效的。。。(将实体写入数据库时导致异常) 奇怪的是,当我为其中一个属性添加RuleFor时,表单很好地得到了验证 public class RequiredSourceVie

我使用Ninject、MVC4、AutoMapper和FluentValidation粘在一起

我已经为我的视图模型编写了一个验证器,并且已经编写了一个必须在视图模型验证器中调用的可重用验证器

问题是,当我发布表单时,视图模型验证器上没有调用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; }
    }
所需公共类SourceViewModelValidator:AbstractValidator
{
公共必需的SourceViewModelValidator()
{
CreateMap();
}
公共覆盖FluentValidation.Results.ValidationResult验证(RequiredSourceViewModel RequiredSourceViewModel)
{
var validator=新的SourceValidator();
var source=Mapper.Map(requiredSourceViewModel);
返回validator.Validate(源);
}
}
公共类SourceValidator:AbstractValidator
{
publicsourcevalidator()
{
RuleFor(s=>s.Name)
.NotEmpty()
.WithMessage(“Naam mag niet leeg zijn.”)
.长度(1100)
.带有信息(“Naam mag niet langer zijn dan 100卡拉克特”);
RuleFor(s=>s.Url)
.NotEmpty()
.WithMessage(“Url mag niet leeg zijn.”)
.Must(BeAValidUrl)
.WithMessage(“Url为niet geldig”)
.长度(1100)
.WithMessage(“Url mag niet langer zijn dan 100 Krakters”);
}
私有bool BeAValidUrl(字符串url)
{
如果(url==null)
{
返回true;
}
var regex=new regex(@“^http(s):/([\w-]+)+[\w-]+(/[\w-./?%&=])?$”;
返回regex.IsMatch(url);
}
}
公共类来源:IEntity
{
/// 
///获取或设置源的主键。
/// 
公共int Id{get;set;}
/// 
///获取或设置源的名称。
/// 
公共字符串名称{get;set;}
/// 
///获取或设置源的url。
/// 
公共字符串Url{get;set;}
/// 
///获取或设置源的序号。
/// 
/// 
///源的序号。
/// 
公共整数序号{get;set;}
public int?GameId{get;set;}
}

这里可能有什么问题?

您覆盖了错误的重载。您需要使用签名覆盖Validate方法:
public virtual ValidationResult Validate(ValidationContext 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);
 }
公共覆盖验证结果验证(
ValidationContext(上下文)
{
var validator=新的SourceValidator();
变量源=
Map(context.InstanceToValidate);
返回validator.Validate(源);
}
另一个重载仅在手动调用validate(如
validator.validate(object)
时使用