Web API中的模型验证

时间:2015-07-30 14:21:24

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

当我的API的消费者试图对客户进行更新时,我必须验证三件事。

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

  1. 名字或姓氏为空白

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

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

  4. 所以基本上我遇到了以下问题,我想就最合适的解决方法提出一些建议:

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

    基本上是一个说法的问题 if(名字是空的,如果是x,如果是y等)vs(!ModelState.IsValid)

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

    似乎验证属性最适合"简单"验证,即必填字段。但是一旦你开始涉及像#34;我需要查看我的数据库,或者分析自定义值的http请求标头,并基于此,invalid = false"那么做这种与实体如此接近的东西几乎是错误的。

    思想?

    谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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