FluentValidation 子验证器消息未显示
FluentValidation Child Validator Message Not Showing
我有以下子验证器,它有两个构造函数,一个没有参数,另一个传递父对象作为参数:
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)
验证工作正常。但是,虽然显示了没有参数的验证器的消息,但没有显示带有参数的验证器的消息。
儿童使用局部视图导致的问题。当你调用 @Html.Partial("PartialViewName", model.Children[i])
时,你失去了 Children[i] 部分表达式。换句话说,当您为键 "LastName" 呈现验证消息时,ModelState
包含键 "Children[0].LastName"
。
您很可能会看到无参数验证器的消息,因为客户端验证在这里工作。但是对于带参数的验证器,您使用自定义逻辑,它通过 ModelState
.
起作用
解决方案是将局部视图内容移动到主视图,或使用编辑器模板代替局部视图:将局部视图移动到 /ControllerName/EditorTemplates/ 文件夹并调用 @Html.EditorFor(m => m.Children[i], "PartialViewName")
我有以下子验证器,它有两个构造函数,一个没有参数,另一个传递父对象作为参数:
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)
验证工作正常。但是,虽然显示了没有参数的验证器的消息,但没有显示带有参数的验证器的消息。
儿童使用局部视图导致的问题。当你调用 @Html.Partial("PartialViewName", model.Children[i])
时,你失去了 Children[i] 部分表达式。换句话说,当您为键 "LastName" 呈现验证消息时,ModelState
包含键 "Children[0].LastName"
。
您很可能会看到无参数验证器的消息,因为客户端验证在这里工作。但是对于带参数的验证器,您使用自定义逻辑,它通过 ModelState
.
解决方案是将局部视图内容移动到主视图,或使用编辑器模板代替局部视图:将局部视图移动到 /ControllerName/EditorTemplates/ 文件夹并调用 @Html.EditorFor(m => m.Children[i], "PartialViewName")