对于键是枚举

时间:2018-01-04 20:23:15

标签: c# validation asp.net-core enums json.net

我有一个具有以下属性的模型:

[JsonConverter(typeof(MapConvertor))]
[IsValidSomeObject]
public Dictionary<SomeEnum, decimal> SomeMap { get; set; }

我创建了以下自定义ValidationAttribute类来验证它:

public class IsValidSomeObjectAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return ValidationResult.Success;
    }
}

但是当我使用modelState.IsValid时,它说我的对象无效,因为在字典中所有可能的SomeEnum键值都不存在,有趣的是,当我使用调试器时,自定义验证类甚至都不会运行。我想知道有没有办法暗示所有可能的关键值都不需要出现在字典中。谢谢。

更新1:我的自定义验证仅在我为字典提供所有可能的枚举值然后尝试验证时运行。 我认为发生的事情是.NET首先运行默认验证,然后运行我的自定义验证。

更新2:我添加了自定义JSON转换器,此转换器运行但仍然使ModelState无效。我认为模型状态验证甚至不使用我的自定义ValidationAttribute

public class MapConvertor : JsonConverter
{
    // serializing
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // write retVal to stream
        writer.WriteValue(value);
    }

    // de-serializing
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var dictionary = serializer.Deserialize<Dictionary<SomeEnum, decimal>>(reader);

        // if key is not in enum, then add it
        foreach (SomeEnum @enum in Enum.GetValues(typeof(SomeEnum)))
        {
            if (!dictionary.ContainsKey(@enum)) dictionary.Add(@enum, 1);
        }

        return dictionary;
    }

    // always true to indicate object can be serialized/de-serialized
    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

0 个答案:

没有答案