为什么自动属性验证不适用于继承集合的模型?

用户名

我想通过属性向Web API(.NET Framework 4.7.2添加模型验证,但是我遇到这样一个事实,即,如果模型是集合,则此方法不起作用。

我有一个从字典继承的模型类。例如:

...
using System.ComponentModel.DataAnnotations;
...

public class MyModel : Dictionary<string, string>
{
    [StringLength(100)]
    public string SomeField
    {
        get => TryGetValue("someField", out var value) ? value : null;
        set => this["someField"] = value;
    }
}

我所做的:

  1. [ApiController]属性添加到控制器类,以根据请求激活自动模型验证。
  2. 已添加System.ComponentModel.DataAnnotations到项目中。
  3. 向模型字段添加了验证属性。

这适用于简单的模型类,但是如果模型是从集合继承的,则不会发生属性验证。

为了解决此问题,我实现了IValidatableObject接口,在其中编写了以下内容:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    const string validationStatusFieldName = "alreadyValidated";
    if (validationContext.Items.TryGetValue(validationStatusFieldName, out var alreadyValidated) && (bool) alreadyValidated)
        return Enumerable.Empty<ValidationResult>();
    validationContext.Items[validationStatusFieldName] = true;

    var validationResults = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(validationContext.ObjectInstance, validationContext, validationResults, true);
    return isValid
        ? Enumerable.Empty<ValidationResult>()
        : validationResults;
}

在这种情况下,该Validate方法会自动调用,我们可以在其中手动验证属性。但是,如果通过了属性验证而没有验证错误,则将调用Validate方法,在这种情况下,将反复调用自身,这将导致堆栈溢出异常。因此,我添加了一个检查以确保验证已经进行。

这样就可以了,但是还不清楚:为什么这个模型继承了一个集合,为什么不自动检查属性,以及如何解决呢?

用户名

验证者有一个条件,他可以准确选择要如何验证对象。首先检查模型是否为集合,然后检查模型的每个元素。并且由于此集合存储没有验证约束的字符串,因此验证没有任何注释。如果通过属性进行字段验证没有问题,则将Validate调用方法,这将发生。

如何解决这个问题:

  • 实现IValidatableObject接口,并在Validate方法中尝试验证当前实例,并记住退出无限递归。(已在问题中完成)

  • 为模型类创建一个自定义验证属性(从继承ValidationAttribute),该属性将搜索带有验证属性的属性并独立地对其进行验证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的模型上的猫鼬验证方法不适用于 Joi?

来自分类Dev

自动装箱为什么不适用于Short(5)?

来自分类Dev

自动装箱为什么不适用于Short(5)?

来自分类Dev

为什么验证不适用于表单请求?

来自分类Dev

为什么验证不适用于此功能?

来自分类Dev

为什么输入模式属性不适用于数字?

来自分类Dev

为什么`Condition`属性不适用于`ItemGroup`元素?

来自分类Dev

为什么maxWidth属性不适用于EditText?

来自分类Dev

为什么.foregroundColor属性不适用于NSMutableAttributedString?

来自分类Dev

为什么输入模式属性不适用于数字?

来自分类Dev

为什么isEqual:不适用于属性UIButton?

来自分类Dev

为什么此过渡属性不适用于 css?

来自分类Dev

为什么边框属性不适用于列表项?

来自分类Dev

FluentValidation 不适用于外部模型对象的集合

来自分类Dev

为什么CSS的“文本装饰”继承不适用于“内联块”?

来自分类Dev

验证组不适用于集合类型

来自分类Dev

为什么自动激活适用于“for”?

来自分类Dev

Rails 4:模型验证不适用于创建

来自分类Dev

为什么HTML中“ <input>”标记中的“ size”属性仅适用于TEXT而不适用于NUMBER?

来自分类Dev

为什么PyCharm的自动完成功能不适用于我安装的库?

来自分类Dev

为什么“显式等待”不适用于自动提示框?

来自分类Dev

为什么此模式不适用于敲除验证?(分隔的邮政编码)

来自分类Dev

为什么jquery验证不适用于附加元素?

来自分类Dev

为什么身份验证不适用于我的ASP.NET REST API?

来自分类Dev

为什么此jQuery验证不适用于IE 7/8?

来自分类Dev

为什么此模式不适用于敲除验证?(分隔的邮政编码)

来自分类Dev

自动对焦属性不适用于显示状态更改

来自分类Dev

为什么我的函数适用于矩阵但为什么不适用于向量?

来自分类Dev

为什么`vertical-align`属性不适用于带有display:table-cell`的<a>?

Related 相关文章

  1. 1

    为什么我的模型上的猫鼬验证方法不适用于 Joi?

  2. 2

    自动装箱为什么不适用于Short(5)?

  3. 3

    自动装箱为什么不适用于Short(5)?

  4. 4

    为什么验证不适用于表单请求?

  5. 5

    为什么验证不适用于此功能?

  6. 6

    为什么输入模式属性不适用于数字?

  7. 7

    为什么`Condition`属性不适用于`ItemGroup`元素?

  8. 8

    为什么maxWidth属性不适用于EditText?

  9. 9

    为什么.foregroundColor属性不适用于NSMutableAttributedString?

  10. 10

    为什么输入模式属性不适用于数字?

  11. 11

    为什么isEqual:不适用于属性UIButton?

  12. 12

    为什么此过渡属性不适用于 css?

  13. 13

    为什么边框属性不适用于列表项?

  14. 14

    FluentValidation 不适用于外部模型对象的集合

  15. 15

    为什么CSS的“文本装饰”继承不适用于“内联块”?

  16. 16

    验证组不适用于集合类型

  17. 17

    为什么自动激活适用于“for”?

  18. 18

    Rails 4:模型验证不适用于创建

  19. 19

    为什么HTML中“ <input>”标记中的“ size”属性仅适用于TEXT而不适用于NUMBER?

  20. 20

    为什么PyCharm的自动完成功能不适用于我安装的库?

  21. 21

    为什么“显式等待”不适用于自动提示框?

  22. 22

    为什么此模式不适用于敲除验证?(分隔的邮政编码)

  23. 23

    为什么jquery验证不适用于附加元素?

  24. 24

    为什么身份验证不适用于我的ASP.NET REST API?

  25. 25

    为什么此jQuery验证不适用于IE 7/8?

  26. 26

    为什么此模式不适用于敲除验证?(分隔的邮政编码)

  27. 27

    自动对焦属性不适用于显示状态更改

  28. 28

    为什么我的函数适用于矩阵但为什么不适用于向量?

  29. 29

    为什么`vertical-align`属性不适用于带有display:table-cell`的<a>?

热门标签

归档