【问题标题】:Model Validation in Web APIWeb API 中的模型验证
【发布时间】:2015-07-30 14:21:24
【问题描述】:

当我的 API 的使用者尝试对客户进行更新时,我必须验证三件事。

在以下情况下阻止客户更新:

  1. 名字或姓氏为空

  2. 对于某个国家,如果客户的X内部集合为空,则抛出异常。 X 很难解释,所以假设它是一些集合。对于所有其他国家/地区,X 不适用 / 将始终为空。但如果是某个国家,则需要 X。所以它几乎是一个有条件的必需属性。一个客户属于一个国家,所以它是从发送的 JSON 中计算出来的。

  3. 如果数据库中的某些条件为真,则阻止更新客户。

所以基本上我遇到了以下问题,我想要一些关于最合适的解决方法的建议:

我是否创建一个操作过滤器来在保存之前对客户实体进行验证?或者创建从 ValidationAttribute 派生的自定义验证属性并覆盖 IsValid 成员函数会更好。

基本上是说的问题 if (first name is empty, if x, if y, etc) vs (!ModelState.IsValid)

然后使用 IsValid 使自定义属性起作用。

似乎验证属性最适合“简单”验证,即必填字段。但是,一旦您开始进入诸如“我需要查看我的数据库,或分析自定义值的 http 请求标头,并基于此,invalid = false”之类的事情,那么做这种事情如此接近似乎是错误的实体。

想法?

谢谢!

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 action-filter actionfilterattribute


    【解决方案1】:

    我非常喜欢 FluentValidation:https://github.com/JeremySkinner/FluentValidation

    正如您提到的,内置验证属性是有限的。对于复杂的验证,您最好实现自己的属性或使用这样的库。

    我喜欢 FluentValidation 的一点是它在模型级别而不是字段级别执行,这意味着您可以使用相关字段的值进行验证。例如

    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    

    (代码摘自项目的 Wiki 页面)

    它也是可扩展的,因此您也可以在此库之上开发自己的自定义验证器。

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2020-05-22
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多