MVC4 WebAPI拒绝无效的枚举值

Ric*_*ard 15 asp.net-mvc-4 asp.net-web-api

如何使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
}
Run Code Online (Sandbox Code Playgroud)

如果我发布{ Color: 9999 },我最终得到一个模型,其中model.Color = 999,我想要返回一个错误的请求状态代码.

Tec*_*ium 28

事实证明,EnumDataTypeAttributeSystem.ComponentModel.DataAnnotations命名空间中的现成 ValidationAttributes一起提供了Enum.Defined检查.

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

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

public class Car
{
    [EnumDataType(typeof(Color))]
    public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在 WebApi 中对我不起作用 - 这可能仅适用于 MVC 控制器吗? (2认同)

Kob*_*obi 23

一种选择是编写验证器:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用于:

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

public class Car
{
    [ValidEnumValue]
    public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:我使用MVC 4来测试它,而不是Web API,但我认为它应该是相同的. (2认同)
  • 这仍然是2017年ASP.NET Core的一个很好的答案,是的,它完全适用于Web API. (2认同)