Предельные ключи в словаре и количество символов его значения с использованием аннотаций данных - PullRequest
0 голосов
/ 04 октября 2018

Ниже приведено тело запроса POST для вызова моего веб-API.

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

Вот класс, который я использую для привязки этого запроса.

    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 символов.

Таким образом, мой ModelState должен быть недействительным, если указано более 10 ключей или значение содержит более 256 символов.

Как это сделать с помощью аннотаций данных?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы создаете пользовательский атрибут проверки

[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; }
}
0 голосов
/ 04 октября 2018

Я не думаю, что существует какая-либо существующая утилита для этого.Единственный выбор - написать собственный конвертер, как показано ниже:

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

...