FluentValidation子验证器消息未显示

时间:2017-09-11 16:34:54

标签: c# asp.net-mvc .net-4.5 fluentvalidation

我有以下子验证器,带有两个构造函数,一个没有参数,另一个传递父对象作为参数:

public class ChildValidator : AbstractValidator<Child>
{
    public ChildValidator()
    {
        RuleFor(x => x.LastName)
            .NotEmpty()
            .WithMessage("Last Name is required");
    }

    public ChildValidator(Parent parent)
    {
        RuleFor(x => x.LastName)
            .Equal(x => parent.LastName)
            .WithMessage("Parent and child Last Name must be equal");
    }
}

家长验证员:

public class ParentValidator : AbstractValidator<Parent>
{
    public ParentValidator()
    {
        RuleFor(x => x.LastName)
            .NotEmpty()
            .WithMessage("Last Name is required");

        RuleFor(x => x.Children)
            .SetCollectionValidator(parent => new ChildValidator(parent));
    }
}

型号:

[FluentValidation.Attributes.Validator(typeof(ParentValidator))]
public class Parent
{
    public string LastName { get; set; }

    public virtual ICollection<Child> Children { get; set; }
}

[FluentValidation.Attributes.Validator(typeof(ChildValidator))]
public class Child
{
    public string LastName { get; set; }

    public int ParentId { get; set; }
    public virtual Parent Parent { get; set; }
}

在儿童局部视图中:

@using (Html.BeginCollectionItem("Children"))
{
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.ParentId)

    @Html.EditorFor(model => model.LastName)
    @Html.ValidationMessageFor(model => model.LastName)

验证工作正常。但是,当显示没有参数的验证器的消息时,带参数的验证器的消息不是。

1 个答案:

答案 0 :(得分:1)

使用部分视图导致儿童问题。当你致电@Html.Partial("PartialViewName", model.Children[i])时,你会失去孩子[i]表达的一部分。换句话说,当您为密钥&#34; LastName&#34;呈现验证消息时,ModelState包含密钥"Children[0].LastName"

很可能你看到无参数验证器的消息,因为客户端验证在这里工作。但是对于带参数的验证器,您可以使用自定义逻辑,它可以通过ModelState

解决方案是将部分视图内容移动到主视图,或使用编辑器模板而不是部分视图:将部分视图移动到/ ControllerName / EditorTemplates /文件夹并调用@Html.EditorFor(m => m.Children[i], "PartialViewName")