c# - 子属性的选择性验证 - MVC 中的 Fluent Validation

标签 c# asp.net-mvc ninject fluentvalidation

我将 Fluent Validation 与 Ninject.Web.Mvc.FluentValidation 库一起使用,以自动连接我的所有验证器(并使用依赖项注入(inject)来创建验证器)。

我创建了以下模型:

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 类有一个验证器类型并连接父级上的所有 Child 属性。

有什么方法可以在不删除 Ninject 模块的情况下防止这种情况发生?

最佳答案

由于自动接线无法有条件地了解在模型绑定(bind)期间何时应用 ChildValidator 类,因此您似乎有几个替代方案:

  1. 确定重用 subview 模型是否那么重要。面对这种情况,如果子对象不是很复杂,我可能会将 subview 折叠到父 View 中只不过是几个单独使用 Child 对象的 View 。我总是不太愿意对 View 模型进行 super DRY,因为根据我的经验,页面结构往往会随着时间的推移而发生变化。
  2. Clear ModelState errors for Child2.从这里,您可以完全控制 Child2 的验证,包括在这个独特的上下文中为 Child2 完全单独的验证器并手动应用它。这是我喜欢 FluentValidation 的原因之一 - 与数据注释不同,它能够在不同的上下文中将不同的验证逻辑应用于同一 View 模型。

自动接线的值(value)(即它排除的所有额外代码)将排除在这种情况下关闭它的选项,IMO。

关于c# - 子属性的选择性验证 - MVC 中的 Fluent Validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991314/

相关文章:

c# - 忍者。将所有接口(interface)绑定(bind)到单例范围内的同一个类

c# - 如何在 LINQ 中使用多列编写存在子查询?

c# - 为什么动态 IEnumerable 上的 First() 或 ElementAt() 是可等待的?

c# - 第一个 html 帮助程序生成客户端验证属性,而第二个则不

javascript - 使用 AngularJS 和 $http.post 在 MVC 应用程序中下载文件

entity-framework - 在 MVC 5 项目上使用 ASP.NET 标识,但 httpcontext User.ProviderName 为 "AspNetSqlRoleProvider"

nhibernate - Quartz.NET, NH ISession & Ninject Scope

c# - 是否可以使用 C#/WPF 控制 Telerik RadPropertyGrid 的可见性?

c# - 托管 C++ 中奇怪的 GetLastError 返回

c# - SetCookie 似乎无法正常工作