使用数据注释限制字典中的键及其值的字符数

Limit Keys in a dictionary and number of characters of its value using Data Annotations

下面是我 POST 调用我的网站 API 的请求正文。

  {
    "region" : "us-east-2",
    "namespaceName" : "com.xyx.demo.test",
    "tags": {
        "description": "Test Namespace",
        "purpose": "To store demo objects",
        ....
    }
  }

这是我用来绑定此请求的 class。

    public class Input
    {
        public string Region { get; set; }

        public string NamespaceName { get; set; }

        [Description("A set of key value pairs that define custom tags.")]
        public Dictionary<string, string> Tags { get; set; }
    }

我想限制我的标签字典只创建 10 个键,每个键的值不应超过 256 个字符。

因此,如果提供的键超过 10 个或值包含超过 256 个字符,我的 ModelState 应该无效。

我如何使用数据注释来做到这一点?

我认为没有任何现有实用程序可用于此。唯一的选择是像下面这样编写自己的转换器

https://www.jerriepelser.com/blog/custom-converters-in-json-net-case-study-1/

您创建自定义验证属性

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class YourAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (!(value is Dictionary<string, string>))
            return new ValidationResult("Object is not of proper type");

        var dictionary = (Dictionary<string, string>)value;

        if (dictionary.Count > 10)
            return new ValidationResult("Dictionary cant have more than 10 items");

        foreach (var keyValuePair in dictionary)
        {
            if (keyValuePair.Value.Length > 256)
                return new ValidationResult("Value cant be longer than 256.");
        }

        return ValidationResult.Success;
    }
}

那么你的模型

 public class Input
{
    public string Region { get; set; }

    public string NamespaceName { get; set; }

    [Description("A set of key value pairs that define custom tags.")]
    [YourAttribute]
    public Dictionary<string, string> Tags { get; set; }
}