gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:05 25 4
gpt4 key购买 nike

我将 Ninject、MVC4、AutoMapper 和 FluentValidation 结合在一起使用。

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

问题是,当我发布表单时,不会在 View 模型验证器上调用 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; }
}

这里可能出了什么问题?

最佳答案

您正在覆盖错误的重载。您需要使用签名覆盖 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) .

关于c# - 验证未在自定义验证器中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19839217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com