问题 实现IValidatableObject时ValidationContext的用途是什么?


我已经实施了 IValidatableObject 几次,从来没有发现解析的目的是什么 ValidationContext 验证方法是 - 我的典型 IValidatableObject 实现看起来像这样:

 public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
 {
    if (Prop1 == Prop2)
    {
        yield return new ValidationResult(
              "Prop1 and Prop2 must be different.",
              new[] {"Prop1", "Prop2"});
    }
 }

有什么我错过了我可以用过的东西 validationContext 对于?

编辑:我正在使用ASP.NET MVC,这是在类中实现 - 而不是在控制器中。


4735
2018-03-19 12:02


起源



答案:


ValidationContext 包含 IServiceProvider 属性。它是将DI容器传递给验证属性和验证方法的扩展点。 例如,您可以使用它来验证数据库,而无需在模型中设置对dbcontext的依赖性。


6
2018-03-19 12:52



它有助于举例说明如何在这种特殊情况下传递DI容器。 - Stack0verflow
在asp.net mvc中,这可以通过创建自己的验证提供程序来完成。 - Kirill Bestemyanov
你能举个例子吗?我真的很难尝试正确地进行验证,看到没有代码的潜在答案真的很难过:( - Felipe Correa
这个 博客文章 演示了如何使用 ValidationContext 通过DI获得服务。基本上: var service = (IExternalService) validationContext.GetService(typeof(IExternalService)); - bvpb


答案:


ValidationContext 包含 IServiceProvider 属性。它是将DI容器传递给验证属性和验证方法的扩展点。 例如,您可以使用它来验证数据库,而无需在模型中设置对dbcontext的依赖性。


6
2018-03-19 12:52



它有助于举例说明如何在这种特殊情况下传递DI容器。 - Stack0verflow
在asp.net mvc中,这可以通过创建自己的验证提供程序来完成。 - Kirill Bestemyanov
你能举个例子吗?我真的很难尝试正确地进行验证,看到没有代码的潜在答案真的很难过:( - Felipe Correa
这个 博客文章 演示了如何使用 ValidationContext 通过DI获得服务。基本上: var service = (IExternalService) validationContext.GetService(typeof(IExternalService)); - bvpb


你应该检索 Prop1 和 Prop2 来自validationContext。从您的问题来看,很难说您是否正在使用WebForms(因此您具有与属性的代码绑定)或MVC(如果您在控制器中实现此功能)。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
 {
    if (validationContext["Prop1"] == validationContext["Prop2"])
    {
        yield return new ValidationResult(
              "Prop1 and Prop2 must be different.",
              new[] {"Prop1", "Prop2"});
    }
 }

6
2018-03-19 12:16