19

如何使 JSON.NET / MVC 4 WebAPI 拒绝枚举没有成员的整数值?例如:

如果我有这个模型:

public enum Colour { Red = 1 };

public class Model
{
  public Colour Colour { get; set; }
}

Model Post(Model model)
{
   // model.Colour could be 99, 34234234, 0 etc, etc
}

如果我发布{ Color: 9999 },我最终会得到一个 model.Color = 999 的模型,而我想返回一个 Bad Request 状态代码。

4

2 回答 2

36

事实证明EnumDataTypeAttributeSystem.ComponentModel.DataAnnotations与命名空间中开箱即用的 ValidationAttributes 一起执行Enum.Defined 检查

一旦我将此属性应用于我的视图模型,超出范围的整数值验证失败:

public enum Color {Red = 1, Blue = 2}

public class Car
{
    [EnumDataType(typeof(Color))]
    public Color Color { get; set; }
}

注意:由于枚举模型绑定的默认行为,可以解析为在枚举上定义的整数的值仍将通过验证。这意味着,例如,true将被解析为1,这对于这个枚举是有效的。我假设可以映射到整数的字符也可以工作。

如果您只希望一种枚举解析方式起作用,无论是字符串还是整数,请考虑在您的视图模型上使用该特定类型,然后编写一个ValidationAttribute接受枚举类型的自定义,验证您的视图模型上的字符串或整数匹配枚举中的值。

于 2017-03-02T23:43:42.607 回答
26

一种选择是编写验证器:

public class ValidEnumValueAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Type enumType = value.GetType();
        bool valid = Enum.IsDefined(enumType, value);
        if (!valid)
        {
            return new ValidationResult(String.Format("{0} is not a valid value for type {1}", value, enumType.Name));
        }
        return ValidationResult.Success;
    }
}

用于:

public enum Color {Red = 1, Blue = 2}

public class Car
{
    [ValidEnumValue]
    public Color Color { get; set; }
}

在控制器中,ModelState.IsValid将是false.
如果您真的想使请求失败,您也可以抛出一个ValidationException,但我不太确定应该如何使用它们。

于 2013-04-18T13:50:15.263 回答