Web 中的模型验证 API
Model Validation in Web API
当我的 API 的消费者尝试对客户进行更新时,我必须验证三件事。
在以下情况下阻止更新客户:
名字或姓氏为空
对于某个国家,如果客户的X内部集合为空,则抛出异常。 X 很难解释,所以假设它是一些集合。对于所有其他国家/地区,X 不适用/将始终为空。但如果是某个国家,则需要 X。所以它几乎是一个有条件的必需属性。一个客户属于一个国家,所以它是从发送的 JSON 中计算出来的。
如果数据库中的某些条件为真,则阻止更新客户。
所以基本上我遇到了以下问题,我想要一些关于最合适的解决方法的建议:
我是否要创建一个动作过滤器来在保存之前对客户实体进行验证?或者创建从 ValidationAttribute 派生的自定义验证属性并覆盖 IsValid 成员函数会更好。
基本上是说的问题
if (first name is empty, if x, if y, etc) vs (!ModelState.IsValid)
然后使用 IsValid 使自定义属性起作用。
似乎验证属性最适合 "simple" 验证,即必填字段。但是一旦你开始接触 "I need to look at my database, or analyze the http request header for custom values, and based on that, invalid = false" 这样的事情,那么离实体如此之近的事情似乎是错误的。
想法?
谢谢!
我非常喜欢 FluentValidation:https://github.com/JeremySkinner/FluentValidation
正如您所提到的,内置验证属性是有限的。对于复杂的验证,您最好实现自己的属性或使用这样的库。
我喜欢 FluentValidation 的一点是它在模型级别而不是字段级别执行,这意味着您可以使用相关字段的值进行验证。例如
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
(代码摘自项目的 Wiki 页面)
它也是可扩展的,因此您也可以在此库之上开发自己的自定义验证器。
当我的 API 的消费者尝试对客户进行更新时,我必须验证三件事。
在以下情况下阻止更新客户:
名字或姓氏为空
对于某个国家,如果客户的X内部集合为空,则抛出异常。 X 很难解释,所以假设它是一些集合。对于所有其他国家/地区,X 不适用/将始终为空。但如果是某个国家,则需要 X。所以它几乎是一个有条件的必需属性。一个客户属于一个国家,所以它是从发送的 JSON 中计算出来的。
如果数据库中的某些条件为真,则阻止更新客户。
所以基本上我遇到了以下问题,我想要一些关于最合适的解决方法的建议:
我是否要创建一个动作过滤器来在保存之前对客户实体进行验证?或者创建从 ValidationAttribute 派生的自定义验证属性并覆盖 IsValid 成员函数会更好。
基本上是说的问题 if (first name is empty, if x, if y, etc) vs (!ModelState.IsValid)
然后使用 IsValid 使自定义属性起作用。
似乎验证属性最适合 "simple" 验证,即必填字段。但是一旦你开始接触 "I need to look at my database, or analyze the http request header for custom values, and based on that, invalid = false" 这样的事情,那么离实体如此之近的事情似乎是错误的。
想法?
谢谢!
我非常喜欢 FluentValidation:https://github.com/JeremySkinner/FluentValidation
正如您所提到的,内置验证属性是有限的。对于复杂的验证,您最好实现自己的属性或使用这样的库。
我喜欢 FluentValidation 的一点是它在模型级别而不是字段级别执行,这意味着您可以使用相关字段的值进行验证。例如
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
(代码摘自项目的 Wiki 页面)
它也是可扩展的,因此您也可以在此库之上开发自己的自定义验证器。