子属性的选择性验证 - MVC 中的 Fluent Validation
我将 Fluent Validation 与 Ninject.Web.Mvc.FluentValidation 库结合使用来自动连接所有验证器(并使用依赖项注入来创建验证器)。
我创建了以下模型:
public class Parent
{
public string Name { get; set; }
public Child Child1 { get; set; }
public Child Child2 { get; set; }
}
public class Child
{
public string ChildProperty { get; set; }
}
使用以下验证器:
public class ParentValidator : AbstractValidator<Parent>
{
public ParentValidator()
{
RuleFor(model => model.Name).NotEmpty();
RuleFor(model => model.Child1).SetValidator(new ChildValidator());
}
}
public class ChildValidator : AbstractValidator<Child>
{
public ChildValidator()
{
RuleFor(model => model.ChildProperty).NotEmpty();
}
}
我的视图:
@model Parent
@using(Html.BeginForm())
{
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
@Html.EditorFor(model => model.Child1)
@Html.EditorFor(model => model.Child2)
<input type="submit" value="Save" />
}
@model Child
@Html.EditorFor(model => model.ChildProperty)
@Html.EditorFor(model => model.ChildProperty)
我想要完成的是拥有一个具有两个子属性的父模型。 Child1 的属性是必需的,但 Child2 的属性是可选的。这在正常情况下工作得很好,但是当我使用 Ninject 模块自动连接验证器时,它会检测到 Child 类有一个验证器类型,并连接 Parent 上的所有 Child 属性。
有什么方法可以在不删除 Ninject 模块的情况下防止这种情况发生吗?
I'm using Fluent Validation with the Ninject.Web.Mvc.FluentValidation library to automatically wire up all of my validators (and use dependency injection to create the validators).
I created the following Models:
public class Parent
{
public string Name { get; set; }
public Child Child1 { get; set; }
public Child Child2 { get; set; }
}
public class Child
{
public string ChildProperty { get; set; }
}
With the following validators:
public class ParentValidator : AbstractValidator<Parent>
{
public ParentValidator()
{
RuleFor(model => model.Name).NotEmpty();
RuleFor(model => model.Child1).SetValidator(new ChildValidator());
}
}
public class ChildValidator : AbstractValidator<Child>
{
public ChildValidator()
{
RuleFor(model => model.ChildProperty).NotEmpty();
}
}
My Views:
@model Parent
@using(Html.BeginForm())
{
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
@Html.EditorFor(model => model.Child1)
@Html.EditorFor(model => model.Child2)
<input type="submit" value="Save" />
}
@model Child
@Html.EditorFor(model => model.ChildProperty)
@Html.EditorFor(model => model.ChildProperty)
What I am trying to accomplish is to have a parent model that has two child properties. Child1's property is required but Child2's property is optional. This works fine under normal circumstances, but when I use the Ninject module to wire up the validators automatically, then it is detecting that there is a validator type for the Child class and wiring up all of the Child properties on the Parent.
Is there any way I can prevent this from happening without getting rid of the Ninject module?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
由于自动连接无法有条件地了解何时在模型绑定期间应用 ChildValidator 类,因此您似乎有几种选择:
在我看来,自动连接的价值(即它排除的所有额外代码)将排除在这种情况下关闭它的选项。
Since the auto-wireup wouldn't have a way to conditionally understand when to apply the ChildValidator class during model binding, it seems like you have a few alternatives:
The value of auto-wireup (i.e., all the extra code it precludes) would rule out the option of turning that off for this one case, IMO.
您忘记将验证器设置为第二个子属性:
You forget to set validator to second child property:
如果您不想自动连接子验证器,您可以向子验证器添加空接口:
public class PersonalDataValidator : AbstractValidator, IChildValidator
然后在您的工厂中:
If you don't want to auto wireup child validators you can add empty interface to child validator:
public class PersonalDataValidator : AbstractValidator, IChildValidator
And then in your factory: