1

我遵循了本教程中的所有这些步骤:

创建了一个验证器类

public class ProjectValidator : AbstractValidator<ProjectViewModel>
{
    public ProjectValidator()
    {
        //RuleFor(h => h.Milestone).NotEmpty().WithName("Milestone");
        RuleFor(h => h.Applications).NotNull().WithName("Application");
        RuleFor(h => h.InitiativeName).NotNull().WithName("Business Aligned Priority");
        RuleFor(h => h.BusinessDriverId).NotNull().WithName("Business Driver");
        RuleFor(h => h.FundingTypeId).NotNull().WithName("Funding Type");
        RuleFor(h => h.Description).NotEmpty().WithName("Description");
        RuleFor(h => h.Name).NotEmpty().WithName("Project Name");
        RuleFor(h => h.Sponsors).NotNull().WithName("Sponsors");
    }
}

在我的 DTO 上放置一个属性来指定这个验证器

[Validator(typeof(ProjectValidator))]
public class ProjectViewModel
{
}

但是当我去检查 ModelState 错误列表时,在表单发布之后,我看到的错误来自 asp.net-mvc 默认验证。

 public ActionResult UpdateMe(ProjectViewModel entity)
    {
        Project existingProject = this.Repository.Fetch<Project>(entity.Id);

        UpdateProperties(entity, existingProject);
        var allErrors = ModelState.Values.SelectMany(v => v.Errors);
        if (allErrors.Count() > 0)
        {

关于为什么它不流利的任何建议。验证器 ??我在下面添加了我在 gui 上看到的图像

在此处输入图像描述

如果我直接在代码中调用验证器,它就可以正常工作:

 ProjectValidator validator = new ProjectValidator();
 ValidationResult result = validator.Validate(entity);
4

1 回答 1

3

我不确定 FundingTypeId 是什么类型的 HTML 元素,但我假设它是一个下拉列表。如果未选择任何内容,则会出现此错误。不幸的是,这是 FV 与 MVC 集成的限制之一,这是由 MVC 的默认模型绑定器的糟糕设计引起的。该消息不是由 FV 生成的,而是由 DefaultModelBinder 生成的,在这种情况下,传入的值无法转换为属性类型。

查看我在 Fluent Validation 论坛上发布的这两个问题:http: //fluentvalidation.codeplex.com/discussions/250798 http://fluentvalidation.codeplex.com/discussions/253389

于 2011-04-20T12:19:29.080 回答